java字符串和正则表达式.ppt
第5章 字符串和正则表达式,本章学习目标,掌握字符串的常用属性及方法掌握String类和StringBuffer类的使用了解StringTokenizer类的使用了解正责表达式的使用了解Pattern和Matcher类的使用,5.1 字符串常量,Java语言规定字符串常量必须用双引号括起,一个串可以包含字母、数字和各种特殊字符,如+、-、*、/、$等。例如:”You are student.”。当字符串中包含一个字符时,不要把它和字符常量混淆,例如:a是字符常量,而”a”是字符串常量。,实例5-1 字符串常量使用示例,class Exam5_1public static void main(String args)System.out.println(This is constant string!);System.out.println(String+connection.);int i=10;System.out.println(i=+i);,5.2 String类字符串,String类是Java处理字符串的标准格式,也是表示定长字符串的常用方式。String对象一旦被创建了,就不能被改变。如果需要大量改变字符串的内容,应该考虑使用StringBuffer类或者字符数组,其最终结果可以被转换成String格式。,实例5-2多种方法创建String类对象,class Exam5_2 public static void main(String args)String s1=hello;/使用字符串常量赋值 String s2=new String();/通过构造方法创建对象再赋值 s2=hello;String s3=new String(hello);/利用构造方法直接赋值 char s=h,e,l,l,o;/利用字符数组型创建字符串 String s4=new String(s);byte b=104,101,108,108,111;/字节数组型的字符串,参数分别是hello每个字母的ASCII码 String s5=new String(b);System.out.println(s1=+s1);System.out.println(s2=+s2);System.out.println(s3=+s3);System.out.println(s4=+s4);System.out.println(s5=+s5);,5.2.2 String类字符串的基本操作,String类提供了多种方法,使用这些方法或方法的组合,可方便地实现对字符串的处理,实例5-3 String类常用方法示例,class Exam5_3 public static void main(String args)String s=hello;System.out.println(s);System.out.println(this string contains+s.length();System.out.println(the charracter index 4 is+s.charAt(4);System.out.println(the index of the character e is+s.indexOf(e);System.out.println(the hash code for this string is+s.hashCode();,实例5-4 String类求子串示例,class Exam5_4 public static void main(String args)String s=hello;System.out.println(s);System.out.println(the substring from index to 1 to index 3 is+s.substring(1,3);System.out.println(the substring from index to 3 to index 3 is+s.substring(3,3);System.out.println(the substring from index to 2 to index 3 is+s.substring(2,3);System.out.println(the substring from index to 0 to index 3 is+s.substring(0,3);System.out.println(the substring from index to 3 to end is+s.substring(3);,实例5-5 改变字符串大小写,class Exam5_5 public static void main(String args)String s=HeLLo;System.out.println(the upper case is+s.toUpperCase();System.out.println(the lower case is+s.toLowerCase();,实例5-6 字符串连接示例,class Exam5_6 public static void main(String args)String s1=he;String s2=llo;System.out.println(s1 concat s2 is+s1+s2);System.out.println(si concat s2 is+s1.concat(s2);,实例5-7 字符串比较示例,class Exam5_7public static void main(String args)String s1=aaaa;String s2=aaaa;String s3=AAAA;String s4=bcd;if(s1.equals(s2)System.out.println(s1=s2);else System.out.println(s1!=s2);if(s1.equalsIgnoreCase(s3)System.out.println(s1=s3 when ignoring case);else System.out.println(s1!=s3 when ignoring case);if(pareTo(s4)s4);,实例5-8 字符串查找替换示例,classExam5_8 public static void main(String args)String s=hello;System.out.println(s);System.out.println(the first index of l is+s.indexOf(l);System.out.println(the last index of l is+s.lastIndexOf(l);System.out.println(the string after replace is+s.replace(l,L);System.out.println(the string after trim is+s.trim();,实例5-9 字符串转换为基本数据类型示例,class Exam5_9 public static void main(String args)String s=1;System.out.println(s);System.out.println(s+3=+(Integer.parseInt(s)+3);,实例5-10 基本数据类型转换为字符串示例,class Exam5_10 public static void main(String args)int i=3;String s=String.valueOf(i);String s1=Integer.toString(i);String s2=i+;System.out.println(s);System.out.println(s1);System.out.println(s2);,5.3 StringBuffer类字符串,String类是java中最常用的类之一,但它的实例是不可改变的,无论何时,只要一个字符串被改变了,就必须隐含或者显式的创建一个新的String对象来完成它。Java为需要改变的字符串对象提供了一个独立的StringBuffer类。StringBuffer与String类相似,它具有String类的很多功能,甚至更丰富。但是StringBuffer对象可以方便地在缓冲区内被修改,如增加、替换字符或子串,故特别适合于处理可变字符串。当完成了缓冲字符串数据操作后,可以通过调用其方法StringBuffer.toString()或String构造器把它们有效地转换回标准字符串格式。,5.3.1 StringBuffer类字符串的定义,StringBuffer类提供了四个构造方法,可以使用这四个构造方法创建StringBuffer类的对象。这四个构造方法如下所示:StringBuffer()构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。StringBuffer(CharSequence seq)public java.lang.StringBuilder(CharSequence seq)构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。StringBuffer(int capacity)构造一个不带字符,但具有指定初始容量的字符串缓冲区。StringBuffer(String str)构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。,实例5-11 多种方法创建StringBuffer类对象,class Exam5_11public static void main(String args)StringBuffer s1=new StringBuffer();StringBuffer s2=new StringBuffer(5);StringBuffer s3=new StringBuffer(hello);s1.append(hello);s2.insert(0,hello);System.out.println(s1=+s1);System.out.println(s2=+s2);System.out.println(s3=+s3);,5.3.2 StringBuffer类字符串的基本操作,在 StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。,实例5-13 替换StringBuffer对象,class Exam5_13 public static void main(String args)StringBuffer s=new StringBuffer(java);System.out.println(s=+s);s.setCharAt(2,c);System.out.println(s=+s);s.setCharAt(3,k);System.out.println(s=+s);,实例5-14 StringBuffer对象其它常用方法,class Exam5_14 public static void main(String args)StringBuffer s=new StringBuffer(i love java!);System.out.println(s=+s);s.insert(2,really);System.out.println(s=+s);s.replace(9,13,like);System.out.println(s=+s);s.delete(2,9);System.out.println(s=+s);s.deleteCharAt(11);System.out.println(s=+s);s.setLength(6);System.out.println(s=+s);s.reverse();System.out.println(s=+s);,5.4 main()方法的参数,所谓命令行参数,是指执行某个Java应用程序时,从命令行中向程序直接传送的参数。命令行参数是命令后的参数,它不包括命令本身;另外,命令行参数都是字符串。我们可以获得这些参数的值,并运用到程序的执行过程中。Java通过main方法中的参数从命令行中接收参数。main()方法的参数String args是用来接受命令行参数的字符串数组。在程序内部,通过args0、args1的形式,可以访问这些参数字符串,通过args.length可以获得命令行参数的个数。,实例5-15从命令行中输入若干数字字符串,求输入数字串的个数,并求它们的和,public class Exam5_15public static void main(String args)if(args.length1)System.out.println(至少需要有一个参数!);System.exit(0);/终止程序运行int i=0,sum=0;int n=args.length;int arr=new intn;for(i=0;in;i+)System.out.println(参数args+i+是:+argsi);arri=Integer.parseInt(argsi);/将字符串转换成int型sum+=arri;System.out.println(参数个数:+arr.length);System.out.println(参数的和:+sum);,5.5 StringTokenizer类,Java语言中,提供了专门用来分析字符串的类StringTokenizer(位于java.util包中)。该类可以将字符串分解为独立使用的单词,并称之为语言符号。语言符号之间由定界符(delim)或者是空格、制表符、换行符等典型的空白字符来分隔。其他的字符也同样可以设定为定界符。,实例5-16 StringTokenizer示例,import java.util.*;class Exam5_16 public static void main(String args)String str1=Hello world!This is Java code,stringTokenizer Demo.;String str2=How to use StringTokenizer?StringTokenizer?;StringTokenizer strT1=new StringTokenizer(str1,.!);StringTokenizer strT2=new StringTokenizer(str2,?);int num1=strT1.countTokens();int num2=strT2.countTokens();System.out.println(str1 has+num1+words.They are:);while(strT1.hasMoreTokens()String str=strT1.nextToken();System.out.print(+str+);System.out.println(nstr2 has+num2+words.They are:);while(strT2.hasMoreTokens()String str=strT2.nextToken();System.out.print(+str+);,5.6 正则表达式,正则表达式是一种强大而灵活的文本处理工具,用来指定字符串模式。当你需要定位匹配某种模式的字符串时就可以使用正则表达式。在技术上,正则表达式一般和I/O联合使用,实现了对字符串的操作,在先前,这些任务一般都指派给了JAVA中的String、StringBuffer和StringTokenizer这些类;正则表达式提供了一种紧凑的、动态的语言,能够以一种完全通用的方式来解决各种字符串处理(例如:匹配、选择、编辑及验证)问题,可以让我们以编程方式指定那些可以在输入字符串中发现的复杂的文本模式,一旦我们发现了这些模式,那么就可以按照任何我们所希望的方式进行处理了。,5.6.1 正则表达式,要想写好正则表达式,必须先了解正则表达式的语法。1、字符类是可选自符的集合,用封装,比如Jj,0-9,A-Za-z或0-9。这里的-表示范围,表示求补。2、有许多预定以的字符类,像d(数字)或pSc。3、大多数字符与它们自身匹配。4、符号.匹配任何字符,可能行终止符(line terminators)除外,这依赖于标识设置(flag settings)。5、用作转义符,比如.匹配一个句点,匹配一个反斜杠。6、和$分别匹配行头和行尾。7、如果X和Y都是正则表达式,则XY表示“X的匹配后面跟着Y的匹配”。X|Y表示“任何X或Y的匹配”。8、可以将量词(quantifier)用到表达式中,X+表示X重复1次或多次,X*表示X重复0次或多次,X?表示X重复0次或1次。9、默认地,一个量词总是与使总体成功匹配的最长的可能重复匹配。10、可以使用分组来定义子表达式。,5.6.2 模式匹配,在Java中,java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher。一个Pattern是一个正则表达式经编译后的表现模式。表示一个正则表达式的编译版本,可以做类似的对比,就好像是java文件和class文件,一个是让程序员看的,一个是让虚拟机执行的,在Java中一个正则表达式要转换为Pattern对象才能最终被使用,Pattern的complie()方法可以实现,同时,我们可以使用matcher()方法和输入字符串从编译过的Pattern对象中产生Matcher对象。一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查,在Matcher中可以得到你想要得到的处理完成以后的结果值的信息。首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。,实例5-17 中国身份证号码检查,import java.util.regex.*;class Exam5_17 public static void main(String args)String str=args0;String regEx=d17d|X|d15;Pattern p=Ppile(regEx);Matcher m=p.matcher(str);boolean result=m.matches();System.out.println(result);,5.7 应用实例,5.7.1 实例一:字符串分析,统计单词个数 5.7.2 实例二:字符串加密 5.7.3 实例三:E-mail地址匹配,