《字符串和正则表达式.ppt》由会员分享,可在线阅读,更多相关《字符串和正则表达式.ppt(30页珍藏版)》请在三一办公上搜索。
1、1,第6章字符串和正则表达式,本章导读1.String类2.StringBuffer类3.StringTokenizer类4.正则表达式与模式匹配5正则表达式与字符串分解,2,6.1 String类,Java使用java.lang包中的String类来创建一个字符串变量,因此字符串变量是类类型变量,是一个对象。字符串常量 如:“你好”、“1234.987”、“weqweo”。1创建字符串对象 使用String类的构造方法创建字符串对象:例如:String s;s=new String(we are students);声明和创建可用一步完成:String s=new String(we are
2、 students);也可以用一个已创建的字符串创建另一个字符串,如:String tom=String(s);,3,String类还有两个较常用构造方法:(1)String(char a):用一个字符数组a 创建一个字符串对象,如:char a=b,o,y;String s=new String(a);(2)String(char a,int startIndex,int count):提取字符数组a 中的一部分字符创建一个字符串对象,参数startIndex和count分别指定在a中提取字符的起始位置和从该位置开始截取的字符个数,例如:char a=s,t,b,u,s,n;String s
3、=new String(a,2,3);2引用字符串常量对象 字符串常量是对象,因此可以把字符串常量的引用赋值给一个字符串变量(p113图6.1)String s1,s2;s1=“How are you”;s2=“How are you”;S1,s2具有相同的引用。,4,3String 类的常用方法(1)public int length()使用String 类中的length()方法可以获取一个字符串的长度(2)public boolean equals(String s)字符串对象调用String类中的equals方法,比较当前字符串对象的实体是否与参数指定的字符串s的实体相同(p114)(
4、3)public boolean contains(String s)(p114)例子,5,(4)public boolean startsWith(String s)、public boolean endsWith(String s)方法 字符串对象调用startsWith(String s)方法,判断当前字符串对象的前缀是否是参数指定的字符串s 字符串对象调用endsWith(String s)方法,判断当前字符串对象的后缀是否是参数指定的字符串s(例p114)(5)public int compareTo(String s)方法 字符串对象可以使用String类中的compareTo(S
5、tring s)方法,按字典序与参数s指定的字符串比较大小。如果当前字符串与s相同,该方法返回值0;如果当前字符串对象大于s,该方法返回正值;如果小于s,该方法返回负值。(例p115),6,(6)public int indexOf(String s)字符串调用方法indexOf(String s)从当前字符串的头开始检索字符串s,并返回首次出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。字符串调用indexOf(String s,int startpoint)方法从当前字符串的startpoint位置处开始检索字符串s,并返回首次出现s的位置。如果没有检索到字符串s,该方法返回的
6、值是-1。字符串调用lastIndexOf(String s)方法从当前字符串的头开始检索字符串s,并返回最后出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。(例p115),7,(7)public String substring(int startpoint)字符串对象调用该方法获得一个当前字符串的子串,该子串是从当前字符串的startpoint处截取到最后所得到的字符串。字符串对象调用substring(int start,int end)方法获得一个当前字符串的子串,该子串是从当前字符串的start处截取到end处所得到的字符串,但不包括end处所对应的字符。(例p115)(
7、8)public String replaceAll(String old,String new)字符串对象s调用该方法可以获得一个串对象,这个串对象是通过用参数new指定的字符串替换s中由old指定的所有字符串而得到的字符串。(9)public String trim()一个字符串s通过调用方法trim()得到一个字符串对象,该字符串对象是s去掉前后空格后的字符串。,8,4字符串与基本数据的相互转化 java.lang包中的Integer类调用其类方法:public static int parseInt(String s)可以将“数字”格式的字符串,如“12387”,转化为int型数据。类
8、似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法:public static byte parseByte(String s)public static short parseShort(String s)public static long parseLong(String s)public static double parseFloat(String s)public static double parseDouble(String s)同样可以将“数字”格式的字符串,转化为相应的基本数据类型。,9,使用Long类中的p116中的
9、类方法可得到整数的各种进制的字符串表示:例子2有关public static void main(String args)中的String args(p116)有时,我们需要将数字转化为字符串,可以使用String 类的下列类方法:public String valueOf(byte n)public String valueOf(int n)public String valueOf(long n)public String valueOf(float n)public String valueOf(double n)5对象的字符串表示所有的类都默认是java.lang包中Object类的子
10、类或间接子类。Object类有一个public 方法toString(),一个对象通过调用该方法可以获得该对象的字符串表示。例子3,10,6字符串与字符、字节数组(1)字符串与字符数组 我们已经知道String 类的构造方法:String(char)和String(char,int offset,int length)分别用数组a中的全部字符和部分字符创建字符串对象。String类也提供了将字符串存放到数组中的方法:public void getChars(int start,int end,char c,int offset)字符串调用getChars方法将当前字符串中的一部分字符复制到参数
11、c指定的数组中,将字符串中从位置start到end-1位置上的字符复制的数组c中,并从数组c的offset处开始存放这些字符。需要注意的是,必须保证数组c能容纳下要被复制的字符。,11,String 类还提供了一个方法:public char toCharArray()字符串对象调用该方法可以初始化一个字符数组,该数组的长度与字符串的长度相等,并将字符串对象的全部字符复制到该数组中。例子4(2)字符串与字节数组 String类的构造方法String(byte)用指定的字节数组构造一个字符串对象。String(byte,int offset,int length)构造方法用指定的字节数组的一部分
12、,即从数组起始位置offset开始取length个字节构造一个字符串对象。public byte getBytes()方法使用平台默认的字符编码,将当前字符串转化为一个字节数组。例子5,返回,12,6.2 StringBuffer 类,前面我们学习了String字符串对象,String类创建的字符串对象是不可修改的,也就是说,String字符串不能修改、删除或替换字符串中的某个字符,即String对象一旦创建,那么实体是不可以再发生变化的 在这一节,我们介绍StringBuffer类,该类能创建可修改的字符串序列,也就是说,该类的对象的实体的内存空间可以自动的改变大小,便于存放一个可变的字符串
13、。1StringBuffer类的构造方法 StringBuffer类有三个构造方法:(1)StringBuffer()(2)StringBuffer(int size)(3)StringBuffer(String s),13,使用第1个无参数的构造方法创建一个StringBuffer对象,那么分配给该对象的实体的初始容量可以容纳16个字符,当该对象的实体存放的字符序列的长度大于16时,实体的容量自动地增加,以便存放所增加的字符。StringBuffer对象可以通过length()方法获取实体中存放的字符序列的长度,通过capacity()方法获取当前实体的实际容量。使用第2个构造方法创建一个S
14、tringBuffer对象,那么可以指定分配给该对象的实体的初始容量为参数size 指定的字符个数,当该对象的实体存放的字符序列的长度大于size 个字符时,实体的容量自动地增加,以便存放所增加的字符。使用第3个构造方法创建一个StringBuffer对象,那么可以指定分配给该对象的实体的初始容量为参数字符串s的长度额外再加16个字符。当该对象的实体存放的字符序列的长度大于size 个字符时,实体的容量自动地增加,以便存放所增加的字符。,14,2StringBuffer类的常用方法(1)append方法 使用StringBuffer类的append方法可以将其它Java类型数据转化为字符串后,
15、再追加到StringBuffer对象中。(p119)(2)char charAt(int n)得到参数n指定的位置上的单个字符。当前对象实体中的字符串序列的第一个位置为0,第二个位置为1,依次类推。n的值必须是非负的,并且小于当前对象实体中字符串序列的长度。(3)void setCharAt(int n,char ch)将当前StringBuffer对象实体中的字符串位置n处的字符用参数ch指定的字符替换。n的值必须是非负的,并且小于当前对象实体中字符串序列的长度。,15,(4)StringBuffer insert(int index,String str)insert方法将一个字符串插入另
16、一个字符串中,并返回当前对象的引用。(5)public StringBuffer reverse()StringBuffer对象使用reverse()方法将该对象实体中的字符翻转,并返回当前对象的引用。(6)StringBuffer delete(int startIndex,int endIndex)从当前StringBuffer对象实体中的字符串中删除一个子字符串,并返回当前对象的引用。这里startIndex指定了需删除的第一个字符的下标,而endIndex指定了需删除的最后一个字符的下一个字符的下标。因此要删除的子字符串从startIndex到endIndex-1。,16,(7)Str
17、ingBuffer replace(int startIndex,int endIndex,String str)将当前StringBuffer对象实体中的字符串的一个子字符串用参数str指定的字符串替换。被替换的子字符串由下标startIndex 和endIndex,指定,即从startIndex到endIndex-1的字符串被替换。该方法返回当前StringBuffer对象的引用。例子6,返回,17,6.3 StringTokenizer 类,当我们分析一个字符串并将字符串分解成可被独立使用的单词时,可以使用java.util包中的StringTokenizer类,该类有两个常用的构造方法
18、:1StringTokenizer(String s)为字符串s构造一个分析器。使用默认的分隔符集合,即空格符(若干个空格被看做一个空格)、换行符、回车符、Tab符、进纸符。2StringTokenizer(String s,String delim)为字符串s构造一个分析器,参数dilim中的字符被作为分隔符。,18,我们把一个StringTokenizer对象称作一个字符串分析器,字符串分析器封装着语言符号和对其进行操作的方法。一个分析器可以使用nextToken()方法逐个获取字符串分析器中的语言符号(单词),每当获取到一个语言符号,字符串分析器中的负责计数的变量的值就自动减一,该计数变
19、量的初始值等于字符串中的单词数目。字符串分析器调用countTokens()方法可以得到计数变量的值。字符串分析器通常用while循环来逐个获取语言符号,为了控制循环,我们可以使用StringTokenizer类中的hasMoreTokens()方法,只要计数的变量的值大于0,该方法就返回true,否则返回false。下面是一个应用程序(例子7),用户从键盘输入一个浮点数,程序输出分别输出该数的整数部分和小数部分,返回,19,6.4 正则表达式与模式匹配,1正则表达式 一个正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称作正则表达式中的元字符。比如,“dok”中的d就是有特殊意义的
20、元字符,代表0到9中的任何一个。一个正则表达式也称作一个模式,字符串“9ok”和“1ok”都是和模式:“dok”匹配的字符串之一。和一个模式匹配的字符串称作匹配模式字符串,也称作模式匹配字符串。2模式匹配 模式匹配就是检索和指定模式匹配的字符串。Java提供了专门用来进行模式匹配的类,这些类在包中。,20,(1)建立模式对象 进行模式匹配的第一步就是使用Pattern类创建一个对象,称作模式对象。Pattern类调用类方法compile(String patter)来完成这一任务,其中的参数patter是一个正则表达式,称作模式对象使用的模式 例如,我们使用正则表达式“Ad”建立一个模式对象p
21、:Pattern p=Ppile(Ad);如果参数patter指定的正则表达式有错,complie方法将抛出异常:PatternSyntaxException。,21,Pattern类也可以调用类方法compile(String regex,int flags)返回一个Pattern对象,参数flags可以取下列有效值:Pattern.CASE_INSENSITIVE Pattern.MULTILINE Pattern.DOTALL Pattern.UNICODE_CASE Pattern.CANON_EQ 例如,flags取值Pattern.CASE_INSENSITIVE,模式匹配时将忽略
22、大小写。,22,(2)建立匹配对象 模式对象p调用matcher(CharSequence input)方法返回一个Matcher对象m,称作匹配对象,参数input可以是任何一个实现了CharSequence接口的类创建的对象,我们前面学习的String类和StringBuffer类都使用了CharSequence接口。,23,一个Matcher对象m可以使用下列3个方法寻找参数input指定的字符序列中是否有和模式patter匹配的子序列(patter是创建模式对象p时使用的正则表达式)。public boolean find():寻找input和patter匹配的下一子序列public
23、boolean matches():判断input是否完全和patter匹配。public boolean lookingAt():判断从input的开始位置是否有和patter匹配的子序列。,24,下列几个方法也是Matcher对象m常用的方法public boolean find(int start)判断input从参数start指定位置开始是否有和patter匹配的子序列,参数start取值0时,该方法和lookingAt()的功能相同。public String replaceAll(String replacement)Matcher对象m调用该方法可以返回一个字符串对象,该字符串是
24、通过把input中与模式patter匹配的子字符串全部替换为参数replacement指定的字符串得到的(注意,input本身没有发生变化)。public String replaceFirst(String replacement)Matcher对象m调用该方法可以返回一个字符串对象,该字符串是通过把input中第1个与模式patter匹配的子字符串替换为参数replacement指定的字符串得到的(注意,input本身没有发生变化)。例子8,返回,25,元字符模式,在正则表达式(模式)中可以使用一对方括号括起若干个字符,代 表方括号中的任何一个字符。例如pattern=“159ABC”,那
25、么“1ABC”、“5ABC”和“9ABC”都是和模式pattern匹配的字符序列。方括号模式的一些意义如下:abc:代表a、b、c中的任何一个。abc:代表除了a、b、c以外的任何字符 a-d:代表 a至d中的任何一个。另外,中括号里允许嵌套中括号,可以进行并、交、差运算,例如:a-dm-p:代表 a至d,或 m 至 p中的任何字符(并)。a-z&def:代表d、e、或 f中的任何一个(交)。a-f&bc:代表a、d、e、f(差),26,表6.1代表单个字符的元字符,27,表 6.2 限定符,返回,28,限定符模式,用X代表正则表达式中的一个元字符或普通字符,那么X?就表示X出现0次或1次,例
26、如 pattern=“A1359?”(X是“1359”),那么“A”、“A1”、“A3”、“A5”、“A9”是匹配模式pattern的全部字符串。再比如,pattern=“w4”(X是“w”),那么“abcd”、“girl”、“moon”、“flag”都是匹配模式pattern的字符串之一。例子9,返回,29,模式的逻辑或,模式可以使用“|”位运算符进行逻辑“或”运算得到一个新模式。例如,pattern1、pattern2是两个模式,即两个正则表达式。那么 pattern=pattern1|pattern2 就是两个模式的“或”。一个字符串如果匹配模式pattren1或匹配模式pattern2,那么就匹配模式pattern。例子10,返回,30,6.5 正则表达式与字符串分解,String 类提供了一个实用的方法:public String split(String regex)字符串调用该方法时,使用参数指定的正则表达式regex做为分隔标记分解出其中的单词,并将分解出的单词存放在字符串数组中 例子11,