21. \b(?<Word>\w+)\b\s*\k<Word>\b (使用自行命名群组抓取重复字) 使用括号还有许多特别的语法元素,比较通用的列表如下: 抓取(Captures) Positive Lookaround 接下来要谈的是lookahead及lookbehind assertions。它们所查找的是目前符合之前或之后的文字,并不包含目前符合本身。这些就如同”^”及”\b”特殊字符,本身并不会对应任何文字(用来界定位置),也因此称做是zero-width assertions,看些例子也许会清楚些。 (?=exp)是一个”zero-width positive lookahead assertion”。它指的就是符合字尾为exp的文字,但不包含exp本身。 22. \b\w+(?=ing\b) (字尾为ing的字,比如说filling所符合的就是fill) 23. (?<=\bre)\w+\b (前缀为re的字,比如说repeated所符合的就是peated) Negative Lookaround 之前有提到,如何查找一个非特定或非在特定群组的字符。但如果只是要验证某字符不存在而不要对应这些字符进来呢?举个例子来说,假设要查找一个字,它的字母里有q但接下来的字母不是u,可以用下列的RE来做。 26. \b\w*q[^u]\w*\b (一个字,其字母里有q但接下来的字母不是u) 这样的RE会有一个问题,因为[^u]要对应一个字符,所以若q是字的最后一个字母,[^u]这样的下法就会将空格符对应下去,结果就有可能会符合二个字,比如说”Iraq haha”这样的文字。使用Negative Lookaround就能解决这样的问题。 27. \b\w*q(?!u)\w*\b (一个字,其字母里有q但接下来的字母不是u) 28. \d{3}(?!\d) (三个位的数字,其后不接一个位数字) 同样的,可以使用(?<!exp),”zero-width negative lookbehind assertion”,来符合前面没接exp前缀的文字符串。 29. (?<![a-z ])\w{7} (七个字母数字的字符串,其前面没接字母或空格) 30. (?<=<(\w+)>).*(?=<\/\1>) (HTML卷标间的文字) 请批注(Comments Please) 31. HTML卷标间的文字,加上批注 (?<= #查找前缀,但不包含它 寻找最多字符的字及最少字符的字(Greedy and Lazy) 32. a.*b (开始为a结束为b的最多字符的符合字) 若有一字符串是”aabab”,使用上述RE所得到的符合字符串就是”aabab”,因为这是寻找最多字符的字。有时希望是符合最少字符的字也就是lazy matching。只要将重复前述项目的表加上问号(?)就可以把它们全部变成lazy matching。因此”*?”代表的就是重复任意次数,但是使用最少重复的次数来符合。举个例子来说: 33. a.*?b (开始为a结束为b的最少字符的符合字) 若有一字符串是”aabab”,使用上述RE第一个所得到的符合字符串就是”aab”再来是”ab”,因为这是寻找最少字符的字。 *? 重复任意次数,最少重复次数为原则
|
正在阅读:破译天书!正则表达式学习心得体会破译天书!正则表达式学习心得体会
2005-02-19 10:21
出处:
责任编辑:xietaoming
键盘也能翻页,试试“← →”键