JAVA正则表达式语法_第1页
JAVA正则表达式语法_第2页
JAVA正则表达式语法_第3页
JAVA正则表达式语法_第4页
JAVA正则表达式语法_第5页
免费预览已结束,剩余18页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java正则表达式表达式意义:1 .字符x字符x。例如a表示字符a反斜线字符。在书写时要写为。(注意:因为java在第一次解析时,把解析成正则表达式,在第二次解析时再解析为所以凡是不是1.1列举到的转义字符,包括1.1的,而又带有的都要写两次)0n带有八进制值0的字符n(0<=n<=7)0nn带有八进制值0的字符nn(0<=n<=7)0mnn带有八进制值0的字符mnn(0<=m<=3、0<=n<=7)xhh带有十六进制值0x的字符hhuhhhh带有十六进制值0x的字符hhhht制表符('u0009')n新行(换行)符('u

2、000A')r回车符('u000D')f换页符('u000C')a报警(bell)符('u0007')e转义符('u001B')cx对应于x的控制符2 .字符类abca、b或c(简单类)。例如egd表示包含有字符e、g或d。Aabc任何字符,除了a、b或c(否定)。例如Aegd表示不包含字符e、g或d。a-zA-Za到z或A到Z,两头的字母包括在内(范围)a-dm-pa到d或m到p:a-dm-p(并集)a-z&&defd、e或f(交集)a-z&&Fbca至Uz,除了b和c:ad-z(减去)a

3、-z&&Fm-pa到z,而非m到p:a-lq-z(减去)3 .预定义字符类(注意反斜杠要写两次,例如d写为弛任何字符(与行结束符可能匹配也可能不匹配)d数字:0-9D非数字:A0-9s空白字符:tnx0BfrS非空白字符:Asw单词字符:a-zA-Z_0-9W非单词字符:Aw4 .POSIX字符类(仅US-ASCII)(注意反斜杠要写两次,例如pLower)写为pLower)pLower)小写字母字符:a-z。pUpper大写字母字符:A-ZpASCII所有ASCII:x00-x7FpAlpha字母字符:pLowerpUpperpDigit十进制数字:0-9pAlnum字母数字

4、字符:pAlphapDigitpPunct标点符号:!"#$%&'()*+,-./:;<=>?a_'|-pGraph可见字符:pAlnumpPunctpPrint可打印字符:pGraphx20pBlank)空格或制表符:tpCntrl)控制字符:x00-x1Fx7FpXDigit)十六进制数字:0-9a-fA-FpSpace)空白字符:tnx0Bfr5 .java.lang.Character类(简单的java字符类型)pjavaLowerCase等效于java.lang.Character.isLowerCaseOpjavaUpperCase等效

5、于java.lang.Character.isUpperCase。pjavaWhitespace等效于java.lang.Character.isWhitespace。pjavaMirrored等效于java.lang.Character.isMirrored。6 .Unicode块和类别的类pInGreekGreek块(简单块)中的字符pLu大写字母(简单类别)pSc货币符号PInGreek所有字符,Greek块中的除外(否定)pL&&ApLu所有字母,大写字母除外(减去)7 .边界匹配器A行的开头,请在正则表达式的开始处使用A。例如:A(abc)表示以abc开头的字符串。注

6、意编译的时候要设置参数MULTILINE,如Patternp=Ppile(regex,Pattern.MULTILINE);$行的结尾,请在正则表达式白结束处使用。例如:(Abca).*(abc$)表示以bca开头以abc结尾的行。b单词边界。例如b(abc)表示单词的开始或结束包含有abc,(abcjj、jjabc都可以匹配)B非单词边界。例如B(abc)表示单词的中间包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)A输入的开头G上一个匹配的结尾(个人感觉这个参数没什么用)。例如Gdog表示在上一个匹配结尾处查找dog如果没有的话则从开头查找,注意如果开头不是dog则不能匹

7、配。Z输入的结尾,仅用于最后的结束符(如果有的话)行结束符是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:- 新行(换行)符('n')、-后面紧跟新行符的回车符("rn")、- 单独的回车符('r')、- 下一行字符('u0085')、一行分隔符('u2028')或- 段落分隔符('u2029)。z输入的结尾当编译模式时,可以设置一个或多个标志,例如Patternpattern=Ppile(patternString,Pattern.CASE_INSENSITIVE+Patt

8、ern.UNICODE_CASE);下面六个标志都是支持的:- CASE_INSENSITIVE:匹配字符时与大小写无关,该标志默认只考虑USASCII字符。- UNICODE_CASE:当与CASE_INSENSITIVE结合时,使用Unicode字母匹配- MULTILINE:a和$匹配一行的开始和结尾,而不是整个输入- UNIX_LINES:当在多行模式下匹配a和$时,只将'n'看作行终止符- DOTALL:当使用此标志时,.符号匹配包括行终止符在内的所有字符- CANON_EQ:考虑Unicode字符的规范等价8 .Greedy数量词X?X,一次或一次也没有X*X,零次

9、或多次X+X,一次或多次XnX,恰好n次Xn,X,至少n次Xn,mX,至少n次,但是不超过m次9 .Reluctant数量词X?X,一次或一次也没有X*?X,零次或多次X+?X,一次或多次Xn?X,恰好n次Xn,?X,至少n次Xn,m?X,至少n次,但是不超过m次10 .Possessive数量词X?+X,一次或一次也没有X*+X,零次或多次X+X,一次或多次Xn+X,恰好n次Xn,+X,至少n次Xn,m+X,至少n次,但是不超过m次Greedy,Reluctant,Possessive的区别在于:(注意仅限于进行.等模糊处理时)greedy量词被看作贫婪的”,因为它第一次就读入整个被模糊匹配

10、的字符串。如果第一个匹配尝试(整个输入字符串)失败,匹配器就会在被匹配字符串中的最后一位后退一个字符并且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符可以后退为止。根据表达式中使用的量词,它最后试图匹配的内容是1个或者0个字符。但是,reluctant量词采取相反的方式:它们从被匹配字符串的开头开始,然后逐步地一次读取一个字符搜索匹配。它们最后试图匹配的内容是整个输入字符串。最后,possessive量词总是读完整个输入字符串,尝试一次(而且只有一次)匹配。和greedy量词不同,possessive从不后退11 .Logical运算符XYX后跟YX|YX或Y(X)X,作为捕获组。

11、例如(abc)表示把abc作为一个整体进行捕获12.Back引用n任何匹配的nth捕获组捕获组可以通过从左到右计算其开括号来编号。例如,在表达式(A)(B(C)中,存在四个这样的组:1 (A)(B(C)2 A3 (B(C)4 (C)在表达式中可以通过n来对相应的组进彳T引用,例如(ab)341就表示ab34ab,(ab)34(cd)12就表示ab34cdabcd。13 .引用Nothing,但是引用以下字符QNothing,但是引用所有字符,直到E。QE之间的字符串会原封不动的使用(1.1中转义字符的除外)。例如,abQ|E可以匹配ab|ENothing,但是结束从Q开始的引用14 .特殊构造

12、(非捕获)(?:X)X,作为非捕获组(?idmsux-idmsux)Nothing,但是将匹配标志由on转为off。比如:表达式(?i)abc(?-i)def这日(?i)打开不区分大小写开关,abc匹配idmsux说明如下:- iCASE_INSENSITIVE:US-ASCII字符集不区分大小写。(?i)- dUNIX_LINES:打开UNIX换行符- mMULTILINE:多行模式(?m)UNIX下换行为nWINDOWS下换行为rn(?s)- uUNICODE_CASE:Unicode不区分大小写。(?u)- xCOMMENTS:可以在pattern里面使用注解,忽略pattern里面的w

13、hitespace,以及"#"一直到Z尾(#后面为注解)。(?x)例如(?x)abc#asfsdadsa可以匹配字符串abc(?idmsux-idmsux:X)X,作为带有给定标志on-off的非捕获组。与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者(?i)abc(?-i:def)(?=X)X,通过零宽度的正lookahead。零宽度正先行断言,仅当子表达式X在此位置的右侧匹配时才继续匹配。例如,w+(?=d)表示字母后面跟数字,但不捕获数字(不回溯)(?!X)X,通过零宽度的负lookahead。零宽度负先行断言。仅当子表达式X不在此位置的右侧匹配

14、时才继续匹配。例如,w+(?!d)表示字母后面不跟数字,且不捕获数字。(?<=X)X,通过零宽度的正lookbehind。零宽度正后发断言。仅当子表达式X在此位置的左侧匹配时才继续匹配。例如,(?<=19)99表示99前面是数字19,但不捕获前面的19。(不回溯)(?(?>X)X,作为独立的非捕获组(不回溯)(?=X)与(?>X)的区别在于(?>X)是不回溯的。例如被匹配的字符串为abcm当表达式为a(?:b|bc)m是可以匹配的,而当表达式是a(?>b|bc)时是不能匹配的,因为当后者匹配到b时,由于已经匹配,就跳出了非捕获组,而不再次对组内的字符进行匹配

15、。可以加快速度。注意:有评论说最后一句说的有问题这里有问题!abcm也可被a(?>b|bc)匹配!引言正则表达式(regularexpression)就是用一个字符串”来描述一个特征,然后去验证另一个字符串”是否符合这个特征。比如表达式“ab+”描述的特征是J个'a'和任意个'b':那么'ab','abb','abbbbbbbbbb'都符合这个特征。正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符

16、串更加灵活方便。(3)用来替换,比普通的替换更强大。正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。1 .正则表达式规则1.1 普通字符字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与

17、之相同的一个字符。举例1:表达式"c",在匹配字符串"abcde"时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)举例2:表达式"bcd",在匹配字符串"abcde"时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。1.2 简单的转义字符一些不便书写的字符,采用在前面加""的方法。这些字符其实我们都已经熟知了表达式可匹配r,

18、n代表回车和换行符t制表符代表""本身还有其他一些在后边章节中有特殊用处的标点符号,在前面加""后,就代表该符号本身。比如:人,$都有特殊意义,如果要想匹配字符串中"A"和"$"字符,则表达式就需要写成"A"和"$"。表达式可匹配A匹配A符号本身$匹配$符号本身.匹配小数点(.)本身这些转义字符的匹配方法与"普通字符"是类似的。也是匹配与之相同的一个字符。举例1:表达式“$d",在匹配字符串"abc$de"时,匹配结果是:成功

19、;匹配到的内容是:"$d";匹配到的位置是:开始于3,结束于5。1.3 能够与多种字符匹配的表达式正则表达式中的一些表示方法,可以匹配多种字符其中的任意一个字符。比如,表达式"d"可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌表达式可匹配d任意一个数字,09中的任意一个w任意一个字母或数字或下划线,也就是AZ,az,09,_中任意一个s包括空格、制表符、换页符等空白字符的其中任意一个.小数点可以匹配除了换行符(n)以外的任意一个字符举例1:表达式"dd

20、",在匹配"abc123"时,匹配的结果是:成功;匹配到的内容是:"12"匹配到的位置是:开始于3,结束于5o举例2:表达式"a.d",在匹配"aaa100"时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4o1.4 自定义能够匹配多种字符的表达式使用方括号包含一系列字符,能够匹配其中任意一个字符。用r包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。表达式可匹配ab5匹配"

21、;a"或"b"或"5"或""Aabc匹配"a","b","c"之外的任意一个字符f-k匹配""k"之间的任意一个字母AA-F0-3匹配"A""F","0""3"之外的任意一个字符举例1:表达式"bcdbcd"匹配"abc123"时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于

22、1,结束于3。举例2:表达式?abc"匹配"abc123"时,匹配的结果是:成功;匹配到的内容是:"1"匹配到的位置是:开始于3,结束于4。1.5 修饰匹配次数的特殊符号前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。使用方法是:"次数修饰"放在"被修饰的表达式"后边。比如:"bcdbcd"可以写成"bcd2"表达式作用

23、n表达式重复n次,比如:"w2"相当于"ww";"a5"相当于"aaaaa"m,n表达式至少重复m次,最多重复n次,比如:"ba1,3"可以匹配"ba"或"baa"或"baaa"m,表达式至少重复m次,比如:"wd2,"可以匹配"a12","_456","M12344".?匹配表达式0次或者1次,相当于0,1,比如:"acd?"可以匹配&

24、quot;a","ac","ad"+表达式至少出现1次,相当于1,,比如:"a+b"可以匹配"ab","aab","aaab".*表达式不出现或出现任意次,相当于0,,比如:"A*b"可以匹配"b","AAAb".举例1:表达式"d+.?d*"在匹配"Itcosts$12.5"时,匹配的结果是:成功;匹配到的内容是:"12.5"匹配到的位置是:开始

25、于10,结束于14。举例2:表达式"go2,8gle"在匹配"Adsbygoooooogle"时,匹配的结果是:成功;匹配到的内容是:"goooooogle";匹配到的位置是:开始于7,结束于17。1.6 其他一些代表抽象意义的特殊符号一些符号在表达式中代表抽象的特殊意义:表达式作用A与字符串开始的地方匹配,不匹配任何字符$与字符串结束的地方匹配,不匹配任何字符b匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。举例1:表达式"Aaaa"在匹配&quo

26、t;xxxaaaxxx"时,匹配结果是:失败。因为内要求与字符串开始的地方匹配,因此,只有当"aaa"位于字符串的开头的时候,"Aaaa"才能匹配,比如:"aaaxxxxxx"。举例2:表达式"aaa$"在匹配"xxxaaaxxx"时,匹配结果是:失败。因为"$"要求与字符串结束的地方匹配,因此,只有当"aaa"位于字符串的结尾的时候,"aaa$"才能匹配,比如:"xxxxxxaaa"。举例3:表达式&qu

27、ot;.b."在匹配"abc"时,匹配结果是:成功;匹配到的内容是:"a";匹配到的位置是:开始于2,结束于4o进一步说明:"b"与"A"和"$"类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是"w"范围,另一边是非"w"的范围。举例4:表达式"bendb"在匹配"weekend,endfor,end"时,匹配结果是:成功;匹配到的内容是:"end";匹配

28、到的位置是:开始于15,结束于18。一些符号可以影响表达式内部的子表达式之间的关系:表达式作用|左右两边表达式之间"或"关系,匹配左边或者右边()(1).在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰(2).取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到举例5:表达式"Tom|Jack"在匹配字符串"I'mTom,heisJack"时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack&

29、quot;匹配到的位置时:开始于15,结束于19。举例6:表达式"(gos*)+"在匹配"Let'sgogogo!"时,匹配结果是:成功;匹配到内容是:"gogogo";匹配到的位置是:开始于6,结束于14。举例7:表达式"¥(d+.?d*)"在匹配"$10.9,¥20.5"时,匹配的结果是:成功;匹配到的内容是:"¥20.5"匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:"20.5"。2 .正

30、则表达式中的一些高级规则2.1 匹配次数中的贪婪与非贪婪在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"m,n","m,","?","*"+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本"dxxxdxxxd",举例如下:表达式匹配结果(d)(w+)"w+"将匹配第一个"d"之后的所有字符"xxxdxxxd"(d)(

31、w+)(d)"w+"将匹配第一个"d"和最后一个"d"之间的所有字符"xxxdxxx"。虽然"w+"也能够匹配上最后一个"d",但是为了使整个表达式匹配成功,"w+"可以"让出"它本来能够匹配的最后一个"d"由此可见,"w+"在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个"d",但那也是为了让整个表达式能够匹配成功。同理,带"*

32、"和"m,n"的表达式都是尽可能地多匹配,带"?"的表达式在可匹配可不匹配的时候,也是尽可能的"要匹配"。这种匹配原则就叫作"贪婪"模式。非贪婪模式:在修饰匹配次数的特殊符号后再加上一个"?"号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的"不匹配"。这种匹配原则叫作"非贪婪"模式,也叫作"勉强"模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些

33、,以使整个表达式匹配成功。举例如下,针对文本"dxxxdxxxd"举例:表达式匹配结果(d)(w+?)"w+?"将尽可能少的匹配第一个"d"之后的字符,结果是:"w+?"只匹配了一个"x"(d)(w+?)(d)为了让整个表达式匹配成功,"w+?"不得不匹配"xxx"才可以让后边的"d"匹配,从而使整个表达式匹配成功。因此,结果是:"w+?"匹配"xxx"更多的情况,举例如下:举例1:表达式&quo

34、t;<td>(.*)</td>"与字符串"<td><p>aa</p></td><td><p>bb</p></td>"匹配时,匹配的结果是:成功;匹配到的内容是"<td><p>aa</p></td><td><p>bb</p></td>"整个字符串,表达式中的"</td>"将与字符串中最后一个"

35、</td>"匹配。举例2:相比之下,表达式"<td>(.*?)</td>"匹配举例1中同样的字符串时,将只得到"<td><p>aa</p></td>",再次匹配下一个时,可以得到第二个"<td><p>bb</p></td>"o2.2 反向引用1,2.表达式在匹配时,表达式引擎会将小括号"()"包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配

36、到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的"<td>(.*?)</td>"。其实,"小括号包含的表达式所匹配到的字符串"不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面"括号内的子匹配已经匹配到的字符串"。引用方法是""加上一个数字。"1"引用第1对括号内匹配到J的字符串,"2"引用第

37、2对括号内匹配到的字符串以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号"("在前,那这一对就先排序号。举例如下:举例1:表达式"('|")(.*?1)"在匹配"'Hello',"World""时,匹配结果是:成功;匹配到的内容是:",Hello'"。再次匹配下一个时,可以匹配到""World""。举例2:表达式"(w)14J"在匹配"aabbbb

38、abcdefgccccc111121111999999999"时,匹配结果是:成功;匹配到的内容是"ccccc"。再次匹配下一个时,将得到999999999。这个表达式要求"w"范围的字符至少重复5次,注意与"w5,"之间的区别。举例3:表达式"<(w+)s*(w+(=('|")*?4)?s*)*>*?</1>"在匹配"<tdid='td1'style="bgcolor:whXe"></td>&

39、quot;时,匹配结果是成功。如果"<td>"与"</td>"不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。2.3 预搜索,不匹配;反向预搜索,不匹配前面的章节中,我讲到了几个代表抽象意义的特殊符号:"八","$","b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对"字符串的两头"或者"字符之间的缝隙"附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对"两头"或者"缝

40、隙”附加条件的,更加灵活的表示方法。正向预搜索:"(?=xxxxx)","(?!xxxxx)"格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的“缝隙"或者"两头"附加的条件是:所在缝隙的右侧,必须能够匹配上xxxxx这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似"b",本身不匹配任何字符。"b"只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。举例

41、1:表达式"Windows(?=NT|XP)"在匹配"Windows98,WindowsNT,Windows2000"时,将只匹配"WindowsNT"中的"Windows",其他的"Windows"字样则不被匹配。举例2:表达式"(w)(?=111)(1)+"在匹配字符串"aaaffffff999999999"时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字

42、,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配xxxxx这部分表达式。举例3:表达式"(?!bstopb).)+"在匹配"fdjkaljfdlstopfjdslafdj"时,将从头一直匹配到"stop"之前的位置,如果字符串中没有"stop",则匹配整个字符串。举例4:表达式"do(?!w)"在匹配字符串"done,do,dog"时,只能匹配"d

43、o"。在本条举例中,"do"后边使用"(?!w)"和使用"b"效果是一样的。反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的"左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与“正向预搜索”一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。举例5:表达式"(?<=d4)d+(?=d4)"在匹配&

44、quot;1234567890123456"时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于JScript.RegExp不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java1.4以上的java.util.regex包,.NET中System.Text.RegularExpressions命名空间,以及本站推荐的最简单易用的DEELX正则引擎。3 .其他通用规则还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。3. 1表达式中,可以使用"xXX"和"uXXXX"表示

45、一个字符("X"表示一个十六进制数)形式字符范围xXX编号在0255范围的字符,比如:空格可以使用"x20"表示uXXXX任何字符可以使用"u"再加上其编号的4位十六进制数表示,比如:"u4E2D"3.2在表达式"s","d","w","b"表示特殊意义的同时,对应的大写字母表示相反的意义表达式可匹配S匹配所有非空白字符("s"可匹配各个空白字符)D匹配所有的非数字字符W匹配所有的字母、数字、下划线以外的字符B匹配非

46、单词边界,即左右两边都是"w"范围或者左右两边都不是"w"范围时的字符缝隙3.3在表达式中有特殊意义,需要添加""才能匹配该字符本身的字符汇总字符说明匹配输入字符串的开始位置。要匹配"A"字符本身,请使用"A"$匹配输入字符串的结尾位置。要匹配"$"字符本身,请使用"$"()标记一个子表达式的开始和结束位置。要匹配小括号,请使用“("和")"用来自定义能够匹配多种字符的表达式。要匹配中括号,请使用""和&q

47、uot;"()修饰匹配次数的符号。要匹配大括号,请使用""和"".匹配除了换行符(n)以外的任意一个字符。要匹配小数点本身,请使用"."?修饰匹配次数为0次或1次。要匹配"?"字符本身,请使用"?"+修饰匹配次数为至少1次。要匹配"+"字符本身,请使用"+"*修饰匹配次数为0次或任意次。要匹配"*"字符本身,请使用"*"|左右两边表达式之间"或"关系。匹配"|"本身,

48、请使用"|"3.4括号"()"内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用"(?:xxxxx)"格式举例1:表达式"(?:(w)1)+"匹配"abbccddefg"时,结果是"bbccdd"。括号"(?:)"范围的匹配结果不进行记录,因此"(w)"使用"1"来引用。4. 5常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global表达式属性说明默认情况下,表

49、达式中的字母是要区分大小写的。配置为Ignorecase可使匹配时不区分大小写。有的表达式引擎,Ignorecase把"大小写"概念延伸至UNICODE范围的大小写。默认情况下,小数点"."匹配除了换行符(n)以外的字符。配置为Singleline可使小数点可匹配包括换行符在Singleline内的所有字符。默认情况下,表达式必“和"$"只匹配字符串的开始和结尾位置。如:xxxxxxxxxnMultilinexxxxxxxxx配置为Multiline可以使匹配外,还可以匹配换行符之后,下一行开始前的位置,使"$"匹

50、配外,还可以匹配换行符之前,一行结束的位置。Global主要在将表达式用来替换时起作用,配置为Global表示替换所有的匹配。4.其他提示5. 1如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见本站DEELX正则引擎的说明文档。5.2 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用"八"和"$",比如:"Ad+$"要求整个字符串只有数字。5.3 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用"b",比如:使用b(if|whil

51、e|else|void|int'b)'来匹配程序中的关键字。5.4 表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配"123"、"123."、"123.5"、).5)这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:)d*.?d*),因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:)d+.?d*|.d+)。5.5 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配0次,而这个括号整体又可以匹配无限次,那么情

52、况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如.NET的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。5.6 合理选择贪婪模式与非贪婪模式,参见话题讨论。5.7 或)|"的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为"|"两边的表达式因为交换位置而有所不同。5.进阶与实战有了从本文中掌握的基础,我们可以从实践中进一步巩固我们使用正则表达式的技巧。5. 1下载正则表达式文档chm版本图点击下载c

53、hm版本-DEELX正则语法,包含其他高级语法的chm版本。6. 2下载正则工具RegexMatehTracer2.0试用版(正版很值得购买)下载MatchTracer-471kb7. 3免费使用RegexMatchTracerWeb版读使用MatchTracerWeb版本Web版工具为免费使用,不受RegexMatchTracer主程序的试用期限制。5.4更多深入话题及使用案例也关于递归匹配的讨论-讨论如何使用不支持递归的正则引擎匹配嵌套结构口有问题与站长交流-与站长交流和讨论当本页脚本-本页的关闭高亮”功能,采用javascript的正则表达式实现的。比如表达式:(a+b|cd)$如果你曾

54、经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么正则表达式"(RegularExpression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。许多语言,包括Perl、PHPPython、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(SpecificationRequest)已经得到认可,你可以期待在JDK的下一版本中看到它。然而,

55、如果现在就需要使用正则表达式,又该怎么办呢?你可以从A下载源代码开放的Jakarta-ORO库。本文接下来的内容先简要地介绍正则表达式的入门知识,然后以Jakarta-OROAPI为例介绍如何使用正则表达式。一、正则表达式基础知识我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog"、"Catherine”、"sophisticated”都可以匹配。也就是说:法则急送式:3t匹©己:,£3七事|!理Citheriins.ssph!&

56、;:ieated1.1 句点符号假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符一一句点符号“.”。这样,完整的表达式就是“t.n",它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“tn”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:正则盘达式:-t.n匹配."tainThinHuHtoni+n1Sn»tpn等:1.2 方括号

57、符号为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“口”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“taeion”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:比则栽好式;匹配:tariiTann+力n1.3 “或”符号如果除了上面匹配的所有单词之外,你还想要匹配“toon",那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;

58、这里必须使用圆括号“()”。圆括号还可以用来分组,具体请参见后面介绍。|Z则表达式:;t如|u|i|。|qq)n匹由乙士号ThTen.七.ton,toon1.4 表示匹配次数的符号表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:表一;表荥次数的符号符号次数*。次或者多次+1次或者多次1。次或者1次,的n次mm从n次3m次假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加

59、上一个转义字符“”。连字符连宇将0-93V0-920-94前三个数字中间两个数字最后四个颗字图一:匹配所有123-12-1234形式的社会安全号码假设进行搜索的时候,你希望连字符号可以出现,也可以不出现一一即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示:可选的庭字符可选的连字符0-93V?0-92V?0-94前三个数字中间两个敷宇最后四个数字图二:匹配所有123-12-1234和123121234形式的社会安全号码下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“

60、0-94",再加上字母部分”A-Z2”。图三显示了完整的正则表达式。吗郎处吟翔2图三:匹配典型的美国汽车牌照号码,如8836KV1.5 “否”符号Ax第一个字将不能是£符号称为“否”符号。如果用在方括号内,“八”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。a-z+后维字符可以是近I£之间的任意字母图四:匹配所有单词,但“X开头的除外1.6 圆括号和空白符号假设要从格式为“June26,1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:必需的空格a-z+s+月愤值,至少一个字符必需的遵号年份值

61、0-91,2,s*0-94月份内年|性至多两可选的空格图五:匹配所有MothDD,YYYY格式的日期新出现的“s”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用OROAPI(本文后面详细讨论)提取出它的值。修改后的正则表达式如图六所示:必需的空揩必需的逗号年份值(a-z+)s+0-91,2,s*0-94月份值月惊内圾I鬻至多闲可选的空格第一个组I数千图六:匹配所有MonthDD,YYYY格式的日期,定义月份值为第一个组1.7 其它符号为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。如表

62、二所示:表二:常用符号表二工常用杵号1符号等价的正则表达式P-SD"因A-ZO-9WPA-ZO-9VIM的S例如,在前面社会安全号码的例子中,所有出现“0-9”的地方我们都可以使用“d”。修改后的正则表达式如图七所示:连字符连字符d3d2Vd4前三个数字中间两个数宇最后四个数字图七:匹配所有123-12-1234格式的社会安全号码二、Jakarta-ORO库有许多源代码开放的正则表达式库可供Java程序员使用,而且它们中的许多支持Perl5兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库,它是最全面的正则表达式API之一,而且它与Perl5正则表达式完全兼容。

63、另外,它也是优化得最好的API之一。Jakarta-ORO库以前叫做OROMatcherDanielSavarese大方地把它赠送给了JakartaProjecto你可以按照本文最后参考资源的说明下载它。我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用Jakarta-OROAPI。 PatternCompiler对象首先,创建一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现,允许你把正则表达式编译成用来匹配的Pattern对象。Pai-ternCompiIeroompi1er=newPer15CoopiIer0; Pattern对象要把正则表达式编译成Pattern对象,调用compiler对象的compile()方法,并在调用参数中指定正则表达式。例如,你可以按照下面这种方式编译正则表达式“taeion”Patrnpat_tern=nuII;try(pa"ttern=compi!Ier_tcumpiIe(.iaei:1catch(litaIformedPa'MternExceptione)s.prinStackTra

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论