,结果就有可能会符合二个字,比如说”Iraq haha”这样的文字。使用Negative Lookaround就能解决这样的问题。
27. \b\w*q(?!u)\w*\b (一个字,其字母里有q但接下来的字母不是u) 这是”zero-width negative lookahead assertion”。
28. \d{3}(?!\d) (三个位的数字,其后不接一个位数字)
同样的,可以使用(?<!exp),”zero-width negative lookbehind assertion”,来符合前面没接exp前缀的文字符串。
29. (?<![a-z ])\w{7} (七个字母数字的字符串,其前面没接字母或空格) 30. (?<=<(\w+)>).*(?=<\/\1>) (HTML卷标间的文字) 这使用lookahead及lookbehind assertion来取出HTML间的文字,不包括HTML卷标。
请批注(Comments Please) 括号还有个特殊的用途就是用来包住批注,语法为”(?#comment)”,若设定”Ignore Pattern Whitespace”选项,则RE中的空格符当RE使用时会乎略。此选项设定时,”#”之后的文字会乎略。
31. HTML卷标间的文字,加上批注 (?<= #查找前缀,但不包含它 <(\w+)> #HTML标签 ) #结束查找前缀 .* #符合任何文字 (?= #查找字尾,但不包含它 <\/\1> #符合所抓取群组1之字符串,也就是前面小括号的HTML标签 ) #结束查找字尾
寻找最多字符的字及最少字符的字(Greedy and Lazy) 当RE下要查找一个范围的重复时(如”.*”),它通常会寻找最多字符的符合字,也就是Greedy matching。举例来说。
32. a.*b (开始为a结束为b的最多字符的符合字) 若有一字符串是”aabab”,使用上述RE所得到的符合字符串就是”aabab”,因为这是寻找最多字符的字。有时希望是符合最少字符的字也就是lazy matching。只要将重复前述项目的表加上问号(?)就可以把它们全部变成lazy matching。因此”*?”代表的就是重复任意次数,但是使用最少重复的次数来符合。举个例子来说:
33. a.*?b (开始为a结束为b的最少字符的符合字) 若有一字符串是”aabab”,使用上述RE第一个所得到的符合字符串就是”aab”再来是”ab”,因为这是寻找最少字符的字。
*? 重复任意次数,最少重复次数为原则 +? 重复至少一次,最少重复次数为原则 ?? 重复零次或一次,最少重复次数为原则 {n,m}? 重复至少n次,但不超过m次,最少重复次数为原则 {n,}? 重复至少n次,最少重复次数为原则
还有什么没提到呢? 到目前为止,已经提到了许多建立RE的元素,当然还有许多元素没有提到,下表整理了一些没提到的元素,在最左边的字段的数字是说明在Expresso中的例子。 # 语法 说明 \a Bell 字符 \b 通常是指字的边界,在字符组里所代表的就是backspace \t Tab 34 \r Carriage return \v Vertical Tab \f From feed 35 \n New line \e Escape 36 \nnn ASCII八位码为nnn的字符 37 \xnn 十六位码为nn的字符 38 \unnnn Unicode为nnnn的字符 39 \cN Control N字符,举例来说上一页 [1] [2] [3] [4] [5] [6] 下一页 [网络技术]2009年云南省信息技术会考考试系统培训心得体会上… [网络技术]2009年云南省信息技术会考考试系统培训心得体会下… [精彩网文]大学生励志:一位清华学子英语学习心得体会 [系统软件]Regular Expression 正则表达式-4 (C++) [系统软件]Regular Expression 正则表达式-3 (C++) [系统软件]Regular Expression 正则表达式-2 (Java) [系统软件]Regular Expression 正则表达式-1 (C#) [系统软件]The GRETA Regular Expression Template Archive [系统软件]tomcat5下设置EL(expression language) [系统软件]关于邮件地址的regular expression 问题
|