《正则表达式ppt课件.ppt》由会员分享,可在线阅读,更多相关《正则表达式ppt课件.ppt(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、5.7 5.7 正则表达式正则表达式5.7.1 基础知识基础知识1正则表达式简介正则表达式简介(1)验证验证。检验输入字符串是否符合某个给定的模式。例如,校验一个电话号码是否遵循格式“(000)0000-0000”(此处的0表示一个数字)。(2)解析解析。分析输入字符串以分解出它所包含的要素。例如,用模式“(*):(*)”分解出在HTTP头中普遍应用的“Key:Value”格式的头信息。(3)文本处理文本处理。应用程序常常需要有文本处理功能,比如单词的查找替换、电子邮件的格式化或XML文档的集成等,这些操作通常会涉及模式匹配的问题,要借助正则表达式。5.7.1 5.7.1 基础知识基础知识2特
2、殊字符特殊字符在正则表达式中,一些字符具有特殊含义,参见表5.5。特 殊 字 符含 义abca、b和c的任意一个字符abc除了a、b和c之外的任意字符(否定)a-zA-Z从a到z或从A到Z的任意字符(范围)abchij任意a、b、c、h、i和j字符(并集)a-z&hij任意h、i或j(交集)s空白符(空格、tab、换行或回车)S非空白符(s)d数字0-9D非数字0-9w单词字符(数字0-9、26个英文字母和下画线_).除换行符n之外的任何一个字符(要匹配“.”字符本身,请使用“.”)反斜线字符uhhhh十六进制表示的unicode值为hhhh的字符5.7.1 5.7.1 基础知识基础知识以下对
3、表5.5中的每一个特殊字符列举一个示例,如下:System.out.println(b.matches(abc);/ 打印trueSystem.out.println(b.matches(abc);/ 打印falseSystem.out.println(A.matches(a-zA-Z);/ 打印trueSystem.out.println(A.matches(a-zA-Z);/ 打印trueSystem.out.println(R.matches(A-Z&RFG);/ 打印trueSystem.out.println(nt.matches(s2);/ 打印trueSystem.out.pri
4、ntln( .matches(S);/ 打印falseSystem.out.println(3.matches(d);/ 打印trueSystem.out.println(&.matches(D);/ 打印trueSystem.out.println(a_8.matches(w3);/ 打印trueSystem.out.println(n.matches(.);/ 打印falseSystem.out.println(u0041.matches(A);/ 打印true5.7.1 5.7.1 基础知识基础知识3量词量词量词决定表达式将被匹配的次数,以简化表达式的编写,表5.6列出了一些量词所表示字
5、符的出现次数。量 词描 述X*0个或多个X(最大匹配)X+1个或多个X(最大匹配)X?0个或1个X(最大匹配)Xn恰好n个XXn,至少n个XXn,m至少n个X,不多于m个XX*?0个或多个X(最小匹配)X+?1个或多个X(最小匹配)X?0个或1个X(最小匹配)XYX后跟YX|YX或Y(X)定义捕获组n与第n个捕获组相匹配的字串5.7.1 5.7.1 基础知识基础知识以下就表5.6中的几个典型量词列举一些示例,如下:System.out.println(aaaa.matches(a*);/ 打印trueSystem.out.println(aaaa.matches(a+);/ 打印trueSys
6、tem.out.println(aaaa.matches(a?);/ 打印falseSystem.out.println(.matches(a?);/ 打印trueSystem.out.println(aaaa.matches(a4);/ 打印trueSystem.out.println(abcabcabc.matches(abc)2,);/ 打印trueSystem.out.println(4563456257.matches(d3,10);/ 打印true5.7.1 5.7.1 基础知识基础知识4常用表达式设计下面的位置匹配,用于匹配串中的位置。(1)(?=X):与这样的位置相匹配,其右部
7、能匹配X。(2)(?!X):与这样的位置相匹配,其右部不能匹配X。(3)(?=X):与这样的位置相匹配,其左部能匹配X。(4)(?!X):与这样的位置相匹配,其左部不能匹配X。5.7.1 5.7.1 基础知识基础知识运用以上正则式规则,可设计如下常用的正则表达式。(1)数字串数字串:d+,在Java中表示为“d+”。(2)英文单词英文单词:a-z A-Z+,在Java中表示为“a-z A-Z+”。(3)一个汉字一个汉字:u4e00- u9fa5,在Java中表示为“u4e00-u9fa5”。(4)汉字串汉字串:u4e00- u9fa5+,在Java中表示为“u4e00-u9fa5+”。(5)I
8、P地址地址:(d1,3.)3d1,3,在Java中表示为“(d1,3.)3d1,3”。(6)重复字符压缩重复字符压缩:将字符串中连续重复的字符压缩成一个。 例如,“aaabbbcccddd11122+*33”压缩成“abcd12+*.3”。相关代码是:设String s = “”;;则String rs = s.replaceAll(“(.)(1)*”, “$1”);。(7)特定子串提取特定子串提取:例如,String s = %.%CXLL=add1,31,123.12%CXLL=add2,32,124% CXLL=,33,125.12%LL=-121.11;从中提取出%CXLL=add1,
9、31,123,123.12,%CXLL=add2,32,124.12,%CXLL=,33,125.12。提取的正则式设计成“%CXLL=.*?(?=%)”,Java中表示为“%CXLL=.*?(?=%)”。(8)串格式串格式:不能以bug打头但可以由字母、数字组成的812个数的字符串。正则式为“(?!bug)a-zA-Z0-98-12”。5.7.1 5.7.1 基础知识基础知识(2)Matcher类类Matcher类的实例用于根据给定的模式,对字符串进行匹配。使用CharSequence接口把输入的字符串提供给匹配器,以便支持来自不同输入源的字符串的匹配。当创建了匹配器之后,就可以用它来执行以
10、下3类不同的匹配操作: matches()方法试图根据此模式,对整个输入序列进行匹配。 lookingAt()方法试图根据此模式,从开始处对输入序列进行匹配。 find()方法将扫描输入序列,寻找下一个与此模式匹配的地方。5.7.2 5.7.2 正则表达式的应用正则表达式的应用1字符串匹配字符串匹配【例5.12】使用正则表达式匹配输入的字符串。打开“Run Configurations”窗口,配置程序运行时的输入参数,在“Arguments”标签页的“Program arguments”栏输入“abcabcabcdefabc abc+ (abc)+ (abc)2,”,然后单击“Run”按钮运行
11、程序,结果为:Input: abcabcabcdefabcRegular expression: abcabcabcdefabcMatch abcabcabcdefabc at positions 0-14Regular expression: abc+Match abc at positions 0-2Match abc at positions 3-5Match abc at positions 6-8Match abc at positions 12-14Regular expression: (abc)+Match abcabcabc at positions 0-8Match abc
12、 at positions 12-14Regular expression: (abc)2,Match abcabcabc at positions 0-8例5.12 TestRegex.javaimport java.util.regex.*;public class TestRegex public static void main(String args) if (args.length 2) System.out.println(Usage:njava TestRegex + characterSequence regularExpression+);System.exit(0);Sy
13、stem.out.println(Input: + args0 + );for (String arg : args) System.out.println(Regular expression: + arg + );Pattern p = Ppile(arg);Matcher m = p.matcher(args0);while (m.find() System.out.println(Match + m.group() + at positions + m.start() + - + (m.end() - 1);5.7.2 5.7.2 正则表达式的应用正则表达式的应用2字符串分析字符串分析
14、【例5.13】用正则表达式对一个由数字和非数字组成的字符串进行分析,要求:将其中每段连续的数字字符转换成一个整数,若连续的数字字符个数超过4个,则以4个数字为一组进行转换,转换生成的整数依次存入整型数组中。例如,对“c789yz45!786*+56abc123456789”分析后得到的数组内容为:789、45、786、56、1234、5678、9。程序运行结果:7894578656123456789例5.13 GetNumber.javaimport java.util.regex.*;public class GetNumber public static void main(String
15、args) int arr = new int10;/ 创建1个整型数组Pattern p = Ppile(d1,4);/ 编译正则表达式,要求1个到4个数字String s = c789yz45!786*+56abc123456789;Matcher m = p.matcher(s);/ 对字符串进行匹配int i =0;while(m.find() / 寻找与指定模式匹配的下一个子序列int j = 0;j = Integer.parseInt(m.group();/ 将字符串类型转换为整型arri= j;i+;for(int c = 0;ci;c+) System.out.println
16、(arrc);/ 打印数组的内容5.7.2 5.7.2 正则表达式的应用正则表达式的应用3文本替换文本替换正则表达式最擅长于替换文本,有多种方法实现,如下。replaceFirst(String replacement):以repacement替换掉第一个匹配成功的部分。replaceAll(String replacement):以repacement替换掉所有匹配成功的部分。appendReplacement(StringBuffer buf, String replacement):执行渐进式替换,允许再调用其他方法来生成或处理repacement,能够以编程的方式将目标分隔成组,从而实
17、现更为强大的替换功能。appendTail(StringBuffer buf):在执行了一次或多次appendReplacement()之后,调用此方法可以将输入字符串余下的部分复制到buf中。【例5.14】将字符串奇数序列的“java”替换为小写,偶数序列的“java”替换成大写。程序运行结果:java JAVA java JAVA I love java you dislike JAVA例5.14 TestReplaceimport java.util.regex.*;public class TestReplace public static void main(String args)
18、 Pattern p = Ppile(java, Pattern.CASE_INSENSITIVE); / 不区分大小写Matcher m = p.matcher(Java java JAva JAVA I love JAVA you dislike Java );StringBuffer buf = new StringBuffer();int i=0;while(m.find() i+;if(i%2 = 0) m.appendReplacement(buf, JAVA); / 偶数序列的转换成大写 else m.appendReplacement(buf, java); / 奇数序列的转换
19、成小写m.appendTail(buf);System.out.println(buf);5.7.2 5.7.2 正则表达式的应用正则表达式的应用4Scanner定界符定界符在默认情况下,Scanner根据空白字符对输入进行分词,也可以用正则表达式指定自己所需的定界符。【例5.15】使用“.”作为IP地址的定界符。TestScanner.javaimport java.util.*;public class TestScanner public static void main(String args)Scanner scanner = new Scanner(192.168.1.99);scanner.useDelimiter(s*.s*);/ 使用.作为定界符while(scanner.hasNextInt()System.out.println(scanner.nextInt();程序运行结果:192168199
限制150内