您好,欢迎访问三七文档
5.7正则表达式5.7.1基础知识1.正则表达式简介(1)验证。检验输入字符串是否符合某个给定的模式。例如,校验一个电话号码是否遵循格式“(000)0000-0000”(此处的0表示一个数字)。(2)解析。分析输入字符串以分解出它所包含的要素。例如,用模式“(*):(*)”分解出在HTTP头中普遍应用的“Key:Value”格式的头信息。(3)文本处理。应用程序常常需要有文本处理功能,比如单词的查找替换、电子邮件的格式化或XML文档的集成等,这些操作通常会涉及模式匹配的问题,要借助正则表达式。5.7.1基础知识2.特殊字符在正则表达式中,一些字符具有特殊含义,参见表5.5。特殊字符含义[abc]a、b和c的任意一个字符[^abc]除了a、b和c之外的任意字符(否定)[a-zA-Z]从a到z或从A到Z的任意字符(范围)[abc[hij]]任意a、b、c、h、i和j字符(并集)[a-z&&[hij]]任意h、i或j(交集)\s空白符(空格、tab、换行或回车)\S非空白符([^\s])\d数字[0-9]\D非数字[0-9]\w单词字符(数字[0-9]、26个英文字母和下画线_).除换行符\n之外的任何一个字符(要匹配“.”字符本身,请使用“\.”)\\反斜线字符\\uhhhh十六进制表示的unicode值为hhhh的字符5.7.1基础知识以下对表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-z[A-Z]]));//打印trueSystem.out.println(R.matches([A-Z&&[RFG]]));//打印trueSystem.out.println(\n\t.matches(\\s{2}));//打印trueSystem.out.println(.matches(\\S));//打印falseSystem.out.println(3.matches(\\d));//打印trueSystem.out.println(&.matches(\\D));//打印trueSystem.out.println(a_8.matches(\\w{3}));//打印trueSystem.out.println(\n.matches(.));//打印falseSystem.out.println(\\u0041\\\\.matches(A\));//打印true5.7.1基础知识3.量词量词决定表达式将被匹配的次数,以简化表达式的编写,表5.6列出了一些量词所表示字符的出现次数。量词描述X*0个或多个X(最大匹配)X+1个或多个X(最大匹配)X?0个或1个X(最大匹配)X{n}恰好n个XX{n,}至少n个XX{n,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.6中的几个典型量词列举一些示例,如下:System.out.println(aaaa.matches(a*));//打印trueSystem.out.println(aaaa.matches(a+));//打印trueSystem.out.println(aaaa.matches(a?));//打印falseSystem.out.println(.matches(a?));//打印trueSystem.out.println(aaaa.matches(a{4}));//打印trueSystem.out.println(abcabcabc.matches((abc){2,}));//打印trueSystem.out.println(4563456257.matches(\\d{3,10}));//打印true5.7.1基础知识4.常用表达式设计下面的位置匹配,用于匹配串中的位置。(1)(?=X):与这样的位置相匹配,其右部能匹配X。(2)(?!X):与这样的位置相匹配,其右部不能匹配X。(3)(?=X):与这样的位置相匹配,其左部能匹配X。(4)(?!X):与这样的位置相匹配,其左部不能匹配X。5.7.1基础知识运用以上正则式规则,可设计如下常用的正则表达式。(1)数字串:\d+,在Java中表示为“\\d+”。(2)英文单词:[a-zA-Z]+,在Java中表示为“[a-zA-Z]+”。(3)一个汉字:[\u4e00-\u9fa5],在Java中表示为“[\\u4e00-\\u9fa5]”。(4)汉字串:[\u4e00-\u9fa5]+,在Java中表示为“[\\u4e00-\\u9fa5]+”。(5)IP地址:(\d{1,3}\.){3}\d{1,3},在Java中表示为“(\\d{1,3}\\.){3}\\d{1,3}”。(6)重复字符压缩:将字符串中连续重复的字符压缩成一个。例如,“aaabbbcccddd11122++***…33”压缩成“abcd12+*.3”。相关代码是:设Strings=“”;;则Stringrs=s.replaceAll(“(.)(\\1)*”,“$1”);。(7)特定子串提取:例如,Strings=%...%CXLL=add1,31,123.12%CXLL=add2,32,124%CXLL=,33,125.12%LL=-121.11;从中提取出%CXLL=add1,31,123,123.12,%CXLL=add2,32,124.12,%CXLL=,33,125.12。提取的正则式设计成“%CXLL=.*?(?=%)”,Java中表示为“%CXLL=.*?(?=%)”。(8)串格式:不能以bug打头但可以由字母、数字组成的8~12个数的字符串。正则式为“(?!bug)[a-zA-Z0-9]{8-12}”。5.7.1基础知识(2)Matcher类Matcher类的实例用于根据给定的模式,对字符串进行匹配。使用CharSequence接口把输入的字符串提供给匹配器,以便支持来自不同输入源的字符串的匹配。当创建了匹配器之后,就可以用它来执行以下3类不同的匹配操作:matches()方法试图根据此模式,对整个输入序列进行匹配。lookingAt()方法试图根据此模式,从开始处对输入序列进行匹配。find()方法将扫描输入序列,寻找下一个与此模式匹配的地方。5.7.2正则表达式的应用1.字符串匹配【例5.12】使用正则表达式匹配输入的字符串。打开“RunConfigurations”窗口,配置程序运行时的输入参数,在“Arguments”标签页的“Programarguments”栏输入“abcabcabcdefabcabc+(abc)+(abc){2,}”,然后单击“Run”按钮运行程序,结果为:Input:abcabcabcdefabcRegularexpression:abcabcabcdefabcMatchabcabcabcdefabcatpositions0-14Regularexpression:abc+Matchabcatpositions0-2Matchabcatpositions3-5Matchabcatpositions6-8Matchabcatpositions12-14Regularexpression:(abc)+Matchabcabcabcatpositions0-8Matchabcatpositions12-14Regularexpression:(abc){2,}Matchabcabcabcatpositions0-8例5.12TestRegex.javaimportjava.util.regex.*;publicclassTestRegex{publicstaticvoidmain(String[]args){if(args.length2){System.out.println(Usage:\njavaTestRegex+characterSequenceregularExpression+);System.exit(0);}System.out.println(Input:\+args[0]+\);for(Stringarg:args){System.out.println(Regularexpression:\+arg+\);Patternp=Pattern.compile(arg);Matcherm=p.matcher(args[0]);while(m.find()){System.out.println(Match\+m.group()+\atpositions+m.start()+-+(m.end()-1));}}}}5.7.2正则表达式的应用2.字符串分析【例5.13】用正则表达式对一个由数字和非数字组成的字符串进行分析,要求:将其中每段连续的数字字符转换成一个整数,若连续的数字字符个数超过4个,则以4个数字为一组进行转换,转换生成的整数依次存入整型数组中。例如,对“c789yz45!786*+56abc123456789”分析后得到的数组内容为:789、45、786、56、1234、5678、9。程序运行结果:7894578656123456789例5.13GetNumber.javaimportjava.util.regex.*;publicclassGetNumber{publicstaticvoidmain(String[]args){int[]arr=newint[10];//创建1个整型数组Patternp=Pattern.compile((\\d{1,4}));//编译正则表达式,要求1个到4个数字Strings=c789yz45!786*+56abc123456789;Matcherm=p.matcher(s);//对字符串进行匹配inti=0;while(m.find()){//寻找与指定模式匹配的下一个子序列intj=0;j=Integer.parseInt(m.group());//将字符串类型转换为整型arr[i]=j;i++;}for(intc=0;ci;c++){System.out.println(arr[c]);//打印数组的内容}}}5.7.2正则表达式的应用3.文本替换正则表达式最擅长于替换文本,有多种方法实现,如下。replaceFirst(Stringreplacement):以repacement替换掉第一个匹配成功的部分。replaceAll(Stringreplacement):以repacement替换掉所有匹配成功的部分。appendReplacement(StringBufferbuf,Stringreplacement):执行渐进式替换,允许再调用其他方法来生成或处理repacement,能够以编程的方式将目标分隔成组,从而实现更为强大的替换功能。appendTail(StringBufferbuf):在执行了一次或多次appendReplacement()之后,调用此方法可以将输入字符串余下的部分复制到buf中。【例5.14】将字符串奇数序列的“java”替换为小写,偶数序列的“java”替换成大写。程序运行结果:javaJAVAjavaJAVAIlovejavayoudislikeJAVA例5.14TestReplaceimportjava.util.regex.*;publicclassTestReplace{publicstaticvoidmain(String[]args){Patternp=Patter
本文标题:正则表达式(1)
链接地址:https://www.777doc.com/doc-3383201 .html