java中字符串和正则表达式.ppt

上传人:新** 文档编号:569748611 上传时间:2024-07-30 格式:PPT 页数:33 大小:806.55KB
返回 下载 相关 举报
java中字符串和正则表达式.ppt_第1页
第1页 / 共33页
java中字符串和正则表达式.ppt_第2页
第2页 / 共33页
java中字符串和正则表达式.ppt_第3页
第3页 / 共33页
java中字符串和正则表达式.ppt_第4页
第4页 / 共33页
java中字符串和正则表达式.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《java中字符串和正则表达式.ppt》由会员分享,可在线阅读,更多相关《java中字符串和正则表达式.ppt(33页珍藏版)》请在金锄头文库上搜索。

1、2024/7/301第第6章字符串和正则表达式章字符串和正则表达式 本章导读本章导读nString类nStringBuffer类nStringTokenizer类n正则表达式与字符串的替换和分解nScanner类n模式匹配 2024/7/3026.1 String类类 Java使用java.lang包中的String类来创建一个字符串变量,因此字符串变量是类类型变量,是一个对象。2024/7/3031. 创建字符串对象 使用String类的构造方法创建字符串对象,例如: String s;String s; s=new String(we are students) s=new String(

2、we are students);声明和创建可用一步完成: String s=new String(we are students);String s=new String(we are students);也可以用一个已创建的字符串创建另一个字符串,如: String tom=String(s);String tom=String(s);StringString类还有两个较常用的构造方法:类还有两个较常用的构造方法:(1)String (char a)(1)String (char a) 用一个字符数组a 创建一个字符串对象,如 char a=b, o, y;char a=b, o, y;

3、String s=new String(a);String s=new String(a);(2)(2) String(char String(char a,int a,int startIndex,int startIndex,int count)count) 提取字符数组a中的一部分字符创建一个字符串对象,参数startIndex和count分别指定在a中提取字符的起始位置和从该位置开始截取的字符个数,如 char a=s, t , b, u, s, n ;char a=s, t , b, u, s, n ; String s=new String(a,2,3); String s=new

4、 String(a,2,3);2024/7/304 2引用字符串常量对象 字符串常量是对象,因此可以把字符串常量的引用赋值给一个字符串变量,如string s1,s2;s1=How are you;s2=How are you; 这样,s1和s2具有相同的引用,因而具有相同的实体。s1和s2的内存示意如图6.1所示。2024/7/3053. String 3. String 类的常用方法(类的常用方法(1 1)(1 1)public int length()public int length() 获取一个字符串的长度 String s= we are students,tom= String

5、s= we are students,tom= 我们是学生我们是学生;int n1,n2;int n1,n2;n1=s.length(); n1=s.length(); n2=tom.length();n2=tom.length();那么,n1的值是15,n2的值是5。字符串常量也可调用length()获得自身长度,如 你你的的爱爱好好.length() length() 的值是4。 (2 2)public boolean equals(String s)public boolean equals(String s) 比较当前字符串对象的实体是否与参数指定的字符串s的实体相同. String

6、tom=new String( we are students); String tom=new String( we are students); String jerry= new String(we are students); String jerry= new String(we are students); tom.equals(jerry)的值是的值是true (tom=jerry的值是false)。内存示意如图6.2 相近的方法:public boolean equalsIgnoreCase(String s) public boolean equalsIgnoreCase(S

7、tring s) (3 3)public boolean contains(String s) 断当前字符串对象是否含有参数指定的字符串s 例6-1说明了方法equals()和contains()的用法(效果如图6.3所示)。 2024/7/306内存示意如图6.22024/7/3073. String 3. String 类的常用方法(类的常用方法(2 2)( (4 4) ) public boolean startsWith(String s)public boolean startsWith(String s)、public boolean endsWith(String s)publi

8、c boolean endsWith(String s) 判断当前字符串对象的前缀、后缀是否是参数指定的字符串s,如 String tom= 220302620629021,jerry= 21079670924022; String tom= 220302620629021,jerry= 21079670924022; tom.startsWith(220)tom.startsWith(220)的的 值值 是是 true,jerry.startsWith(220)true,jerry.startsWith(220)的的 值值 是是falsefalse。 tom.endsWith(021)tom

9、.endsWith(021)的值是的值是truetrue,jerry.endsWith(021)jerry.endsWith(021)的值是的值是falsefalse。(5 5)public int compareTopublic int compareTo(String sString s) 按字典序与参数s指定的字符串比较大小。如 String str= abcde String str= abcde; pareTo(boy) pareTo(boy)小于小于0 0,pareTo(aba)pareTo(aba)大于大于0 0, pareTo(abcde) pareTo(abcde)等于等于0

10、 0。 相近的方法:public int compareToIgnoreCase(String s)public int compareToIgnoreCase(String s)该方法忽略大小写2024/7/3083. String 3. String 类的常用方法(类的常用方法(3 3)(6 6)public int indexOf (String s)public int indexOf (String s) 从当前字符串的头开始检索字符串s,并返回首次出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。 indexOf(String indexOf(String s s ,in

11、t ,int startpoint)startpoint) 从当前字符串的startpoint位置处开始检索字符串s,并返回首次出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。 lastIndexOf lastIndexOf (String (String s)s) 从当前字符串的头开始检索字符串s,并返回最后出现s的位置.如果没有检索到字符串s,该方法返回的值是-1。如String tom=I am a good cat;String tom=I am a good cat;tom.indexOf(a); /tom.indexOf(a); /值是值是2 2tom.indexOf(

12、good,2); /tom.indexOf(good,2); /值是值是7 7tom.indexOf(a,7); /tom.indexOf(a,7); /值是值是1313 tom.indexOf(w,2); / tom.indexOf(w,2); /值是值是-1 -1 (7 7)public String substring(int startpoint)public String substring(int startpoint) 获得一个当前字符串的子串,该子串是从当前字符串的startpoint处截取到最后所得到的字符串。 substring(int substring(int star

13、t start ,int ,int end)end) 获得一个当前字符串的子串,该子串是从当前字符串的start处截取到end处所得到的字符串,但不包括end处所对应的字符。如 String tom=I love tom;String tom=I love tom; String s=tom.substring(2,5); String s=tom.substring(2,5); 则则s s为为“lovlov”。(8 8)public String trim()public String trim() 字符串对象s调用该方法得到一个字符串对象,该字符串对象是s去掉前后空格后的字符串。2024/

14、7/3094.4.字符串与基本数据的相互转化字符串与基本数据的相互转化 java.lang包中的Integer类调用其类方法: public static int parseInt(String s)public static int parseInt(String s) 将“数字”格式的字符串,如“12387”,转化为int型数据。 类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法: public static byte parseByte(String s)public static byte parseByte(String s

15、) public static short parseShort(String s) public static short parseShort(String s) public static long parseLong(String s) public static long parseLong(String s) public static double parseDouble(String s) public static double parseDouble(String s) public static double parseDouble(String s public sta

16、tic double parseDouble(String s) 可以将“数字”格式的字符串,转化为相应的基本数据类型。使用Long类中的下列类方法可得到整数的各种进制的字符串表示:public static String toBinaryString(long i) public static String toBinaryString(long i) public static String toOctalString(long i) public static String toOctalString(long i) public static String toHexString(lo

17、ng i) public static String toHexString(long i) public static String toString(long i,int p)public static String toString(long i,int p) 其中的toString(longi,intp)返回整数i的p进制表示 例6-2求若干个数的平均数,若干个数从键盘输入(效果如图6.4所示)。2024/7/3010例子6-2 效果图 有时,我们需要将数字转化为字符串,可以使用String 类的下列类方法: public String valueOfpublic String val

18、ueOf(byte nbyte n) public String valueOf public String valueOf(int nint n) public String valueOf public String valueOf(long nlong n) public String valueOf public String valueOf(float nfloat n) public String valueOf public String valueOf(double ndouble n)形如123、1232.98的数值转化为字符串,如String str=String.valu

19、eOf(12313.9876);float x=123.987f; String temp=String.valueOf(x); 2024/7/3011 5 5对象的字符串表示对象的字符串表示 所有的类都默认是java.lang包中Object类的子类或间接子类。Object类有一个public方法public String toString(),一个对象通过调用该方法可以获得该对象的字符串表示。 一个类可以通过重写public String toString()方法,以便获得该类对象想要的字符串表示,比如java.util包中的Date类就重写了public String toString(

20、),使得Date对象调用toString()得到的字符串是由日期信息组成的字符序列。 如果一个类没有重写public String toString()方法,那么该类所创建的对象调用toString()方法方法得到的字符串格式为:类名类名对象的引用对象的引用 例6-3中的Student类重写了toString()方法、TV类没有重写toString()方法. 2024/7/3012 6字符串与字符数组、字节数组(1 1)字符串与字符数组)字符串与字符数组 类的构造方法String(char)和String(char,int offset,int length)分别用数组a中的全部字符和部分字符

21、创建字符串对象。 String类也提供了将字符串存放到数组中的方法: public void getChars(int start,int end,char c,int offset ) 字符串调用getChars()方法将当前字符串中的一部分字符复制到参数c指定的数组中,将字符串中从位置start到end-1位置上的字符复制的数组c中,并从数组c的offset处开始存放这些字符。 String类还提供了一个方法 public char toCharArray() 字符串对象调用该方法可以初始化一个字符数组,该数组的长度与字符串的长度相等,并将字符串对象的全部字符复制到该数组中。 例6-4将用

22、户在键盘输入的字符串加密,然后输出密文,见效果图。(2 2)字符串与字节数组)字符串与字节数组String类的构造方法String(byte)用指定的字节数组构造一个字符串对象。构造方法String(byte,int offset,int length)用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象。方法public byte getBytes()使用平台默认的字符编码,将当前字符串转化为一个字节数组。例6-5使用了字节数组,见效果图。2024/7/3013例子6-4 ,例子6-5效果图例子6-5效果图例子6-4效果图2024/7/30146.

23、2 StringBuffer 类类 前面我们学习了String字符串对象,String类创建的字符串对象是不可修改的。也就是说,String字符串不能修改、删除或替换字符串中的某个字符,即String对象一旦创建,实体是不可以再发生变化的(如图6.5所示).本节将介绍StringBuffer类,该类能创建可修改的字符串序列,即该类的对象的实体的内存空间可以自动的改变大小,便于存放一个可变的字符串。一个StringBuffer对象调用append()方法方法可以追加字符串序列,如 StringBuffer s=new StringBuffer(I love this game); s.appen

24、d(ok);对象s调用append() 追加一个字符串序列,如图6.6所示。2024/7/30151StringBuffer类的构造方法 StringBuffer类 有 3个 构 造 方 法 :StringBuffer(), StringBuffer(int size)和和StringBuffer(String s)。 构造方法StringBuffer()创建一个StringBuffer对象,分配给该对象的实体的初始容量可以容纳16个字符,当该对象的实体存放的字符序列的长度大于16时,实体的容量自动增加,以便存放所增加的字符。StringBuffer对象可以通过方法length()获取实体中存

25、放的字符序列的长度,通过方法capacity()获取当前实体的实际容量。构造方法StringBuffer(int size)创建一个StringBuffer对象,可以指定分配给该对象的实体的初始容量为参数size指定的字符个数。当该对象的实体存放的字符序列的长度大于size个字符时,实体的容量自动增加,以便存放所增加的字符。 构造方法StringBuffer(String s)创建一个StringBuffer对象,可以指定分配给该对象的实体的初始容量为参数字符串s的长度额外再加16个字符。2024/7/30162StringBuffer类的常用方法append()append() 将其他Jav

26、a类型数据转化为字符串后,再追加到StringBuffer对象中。char charAt(int n)char charAt(int n) 得到参数n指定的置上的单个字符。注注: :当前对象实体中的字符串序列的第一个位置为0,第二个位置为1,以此类推。n的值必须是非负的,并且小于当前对象实体中字符串序列的长度。void void setCharAt setCharAt (int (int n, n, char char ch)ch) 将当前StringBuffer对象实体中的字符串位置n处的字符用参数ch指定的字符替换。StringBuffer StringBuffer insert(int

27、insert(int index, index, String String strstr) 将一个字符串插入另一个字符串中,并返回当前对象的引用。public StringBuffer reverse()public StringBuffer reverse()将对象实体中的字符翻转,并返回当前对象的引用。 StringBuffer StringBuffer delete(int delete(int startIndex, startIndex, int int endIndex)endIndex) 从当前StringBuffer对象实体中的字符串中删除一个子字符串,并返回当前对象的引用。

28、这里,startIndex指定了需删除的第一个字符的下标,而endIndex指定了需删除的最后一个字符的下一个字符的下标。 StringBuffer StringBuffer replace( replace( int int startIndex startIndex ,int ,int endIndex, endIndex, String String str)str) 将当前StringBuffer对象实体中的字符串的一个子字符串用参数str指定的字符串替换。被替换的子字符串由下标startIndex和endIndex指定,即从startIndex到endIndex-1的字符串被替换。该

29、方法返回当前StringBuffer对象的应用。 【例6-6】 2024/7/30176.3 StringTokenizer 类类 分析一个字符串并将字符串分解成可被独立使用的单词时,可以使用java.util包中的StringTokenizer类,该类有两个常用的构造方法: StringTokenizer(String StringTokenizer(String s)s) 为字符串s构造一个分析器,使用默认的分隔标记,即空格符(若干个空格被看成一个空格)、换行符、回车符、Tab符等。 StringTokenizer(String StringTokenizer(String s,Strin

30、g s,String delim)delim) 为字符串s构造一个分析器,参数dilim中的字符的任意排列组合都是分隔标记,如 StringTokenizer fenxi=new StringTokenizer(We,are; student, , ; ); StringTokenizer fenxi=new StringTokenizer(We,are; student, , ; ); 把一个StringTokenizer对象称为一个字符串分析器,字符串分析器封装着语言符号和对其进行操作的方法。一个分析器可以使用nextToken()方法逐个获取字符串分析器中的语言符号(单词),每获取到一个

31、语言符号,字符串分析器中的负责计数的变量的值就自动减一,该计数变量的初始值等于字符串中的单词数目,字符串分析器调用countTokens()方法可以得到计数变量的值。 字符串分析器通常用while循循环环来逐个获取语言符号,为了控制循环,我们可以使用StringTokenizer类中的hasMoreTokens()方法,只要计数的变量的值大于0,该方法就返回true,否则返回false。 【例6-7】是一个应用程序,用户从键盘输入一个浮点数,程序分别输出该数的整数部分和小数部分(效果如图6.7所示)。 2024/7/3018例子6-7效果图2024/7/30196.4 正则表达式与模式匹配正则

32、表达式与模式匹配 1 1正则表达式正则表达式 一个正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称作正则表达式中的元字符。例如,“dcat”中的d就是有特殊意义的元字符,代表0到9中的任何一个。字符串0cat,1cat,2cat9cat都是和正则表达式dcat匹配字符串。 字符串对象调用 public public boolean boolean matches(String matches(String regex)regex)方法可以判断当前字符串对象是否和参数regex指定的正则表达式匹配。 表6.1列出了常用的元字符及其意义。Page114 表6.2给出了常用的限定修饰符的

33、用法。 Page115 【例6-8】程序判断用户从键盘输入的字符序列是否全部由英文字母所组成。效果如图6.8所示.2024/7/3020 表6.12024/7/3021 表6.22024/7/30222字符串的替换 JDK1.4之后,字符串对象调用:public String replaceAll(String regex,String replacement)public String replaceAll(String regex,String replacement)方法返回一个字符串,该字符串是当前字符串中所有和参数regex指定的正则表达式匹配的子字符串被参数replacement指

34、定的字符串替换后的字符串,例如:String result=12hello567.replaceAll(a-zA-Z+,String result=12hello567.replaceAll(a-zA-Z+,你好你好););那么result就是:1212你好你好567567。注注:当前字符串调用replaceAll()replaceAll()方方法法返回一个字符串,但不改变当前字符串。 例6-9中,字符串调用replaceAll()replaceAll()方方法法剔除字符串中的网站链接地址(将网站链接地址替换为不含任何字符的字符串,即替换为),运行效果如图6.9 .2024/7/30233字符

35、串的分解 JDK1.4之后,String类提供了一个实用的方法:public String split(String regex)public String split(String regex)字符串调用该方法时,使用参数指定的正则表达式regex做为分隔标记分解出其中的单词,并将分解出的单词存放在字符串数组中。例如,对于字符串:str=1945str=1945年年0808月月1515日是抗日战争胜利纪念日!日是抗日战争胜利纪念日!;如果准备分解出全部由数字字符组成的单词,就必须用非数字字符串作为分隔标记,因此,可以使用正则表达式:String regex=D+; String regex=

36、D+; 作为分隔标记分解出str中的单词:String digitWord=str.split(regex);String digitWord=str.split(regex);那么,digitWord0、digitWord1和digitWord2就分别是1945、08和15。下面的例6-10中,用户从键盘输入一行文本,程序输出其中的单词,效果如图6.10.2024/7/30246.5 Scanner类类 Scanner类不仅可以创建出用于读取用户从键盘输入的数据的对象,而且也可以创建出用于解析字符串的对象。 当需要Scanner类的对象解析字符串str时,可以如下构造一个Scanner类的对

37、象scanner:Scanner scanner=new Scanner(str);Scanner scanner=new Scanner(str);2024/7/30251使用默认分隔标记解析字符串使用默认分隔标记解析字符串 创建Scanner对象,并将要解析的字符串传递给所构造的对象,例如,对于字符串:String NBA = I Love This Game;String NBA = I Love This Game; 为了解析出NBA中的单词,可以构造一个Scanner对象: Scanner scanner = new Scanner(NBA);Scanner scanner = ne

38、w Scanner(NBA); 那么scanner将空白作为分隔标记,调用next()方法依次返回NBA中的单词,如果NBA最后一个单词已被next()方法返回,scanner调用hasNext()将返回false,否则返回true。 对于数字型的单词,如618,168.98等可以用nextInt()或nextDouble()方法来代替next()方法,即scanner可以调用nextInt()或nextDouble()方法将数字型单词转化为int型或double型数据返回. 注注意意,如果单词不是数字型单词,调用nextInt()或nextDouble()方法将发生InputMismatch

39、Exception异常,在处理异常时可以调用next()方法返回该非数字化单词。 例6-11中,使用Scanner对象解析出字符串TV cost 876 dollar,Computer cost 2398 dollar 中的全部价格数字(价格数字的前后需有空格),并计算了总消费。程序运行效果如图6.11所示。2024/7/3026例子6-11效果图2024/7/30272使用正则表达式作为分隔标记解析字符串使用正则表达式作为分隔标记解析字符串 Scanner对象可以调用 useDelimiter(useDelimiter(正则表达式正则表达式);); 方法将一个正则表达式作为分隔标记,即和正则

40、表达式匹配的字符串都是分隔标记。 例6-12使用正则表达式(匹配所有非数字字符串): String regex=0123456789.+; String regex=0123456789.+; 作为分隔标记解析字符串市话费:176.89元,长途费:187.98元,网络费:928.66元中的全部价格数字,并计算了总的通信费用。程序运行效果如图6.12。 对于上述例6-12中提到的字符串,如果用非数字字符串作分隔标记,那么所有的价格数字就是单词。2024/7/30286.6 模式匹配模式匹配 模式匹配就是检索和指定模式匹配的字符串。Java提供了专门 用 来 进 行 模 式 匹 配 的 Patte

41、rn类 和 Match类 , 这 些 类 在java.util.regex包中。 以下结合具体问题来讲解使用Pattern类和Match类的步骤。 假设有字符串: String input = String input = Have Have 7 7 monkeys monkeys on on the the tree, tree, walk walk 2 2 monkeys, monkeys, still still leave leave how how many monkeys?many monkeys? 我们想知道input从哪个位置开始至哪个位置结束曾出现了字符串monkeys。 使

42、用Pattern类和Match类检索字符串str中的子字符串的步骤如下:2024/7/30291模式对象模式对象 使用正则表达式regex做参数得到一个称为模式的Pattern类的实例pattern:Patternpattern=Ppile(regex);例如:Stringregex=monkeys;pattern=Ppile(regex); 模式对象是对正则表达式的封装。 如 果 参 数 regex指 定 的 正 则 表 达 式 有 错 , complie方 法 将 抛 出 异 常 :PatternSyntaxException。Pattern类也可以调用类方法compile(String

43、regex, intflags)返回一个Pattern对象,参数flags可以取下列有效值:Pattern.CASE_INSENSITIVEPattern.MULTILINEPattern.DOTALLPattern.UNICODE_CASEPattern.CANON_EQ例如,flags取值Pattern.CASE_INSENSITIVE,模式匹配时将忽略大小写。 2024/7/30302. 匹配对象 得到可以检索字符串input的Matcher类的实例matcher(称为匹配对象):Matchermatcher=pattern.matcher(input); 模式对象pattern调用ma

44、tcher(CharSequenceinput)方法返回一个Matcher对象matcher,称为匹配对象,参数input用于给出matcher要检索的字符串参数input可以是任何一个实现了CharSequence接口的类创建的对象。 Matcher对象matcher可以使用下列方法寻找字符串input中是否有和模式regex匹配的子序列。* *public public boolean boolean find()find():寻找input和regex匹配的下一子序列,如果成功该方法返回true,否则返回false。* *public boolean matches()public bo

45、olean matches():判断input是否完全和regex匹配。* *public boolean lookingAt()public boolean lookingAt():判断从input的开始位置是否有和regex匹配的子序列。* *public public boolean boolean find(int find(int start)start) 判断input从参数start指定位置开始是否有和regex匹配的子序列,参数start取值0时,该方法和lookingAt()的功能相同。* *public public String String replaceAll(Str

46、ing replaceAll(String replacementreplacement) 返回一个字符串,该字符串是通过把input中与模式regex匹配的子字符串全部替换为参数replacement指定的字符串得到的。* *public public String String replaceFirst(String replaceFirst(String replacementreplacement) 返回一个字符串,该字符串是通过把input中第1个与模式regex匹配的子字符串替换为参数replacement指定的字符串得到的。 例6-13查找一个字符串中全部的单词monkeys以及

47、该单词的在字符串中的位置(位置索引从0开始)。程序运行效果如图6.13。 例6-14使用模式匹配查找一个字符串中的网址,然后将网址串全部剔除得到一个新字符串,运行效果如图6.14。 2024/7/3031例子6-13,例子6-14效果图2024/7/30323. 模式的逻辑或模式的逻辑或 模式可以使用位运算符“|”进行逻辑“或”运算得到一个新模式。例如,pattern1和pattern2是两个模式,即两个正则表达式。那么,pattern=pattern1|pattern2就是两个模式的“或”。 一个字符串如果匹配模式pattren1或匹配模式pattern2,那么就匹配模式pattern。 。 例6-15模式的逻辑或.上述程序的运行结果如下上述程序的运行结果如下:从从0 0到到7 7匹配模式子序列匹配模式子序列: :loveyouloveyou从从7 7到到1313匹配模式子序列匹配模式子序列: :hatemehateme从从1313到到2020匹配模式子序列匹配模式子序列: :love123love123从从2323到到2929匹配模式子序列匹配模式子序列: :hate99hate99 从从3030到到3737匹配模式子序列匹配模式子序列: :love888love888 2024/7/3033

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号