|
Expresso提供了一个功能,它可以将所下的RE变成树状的说明,一组组的分开说明,提供了一个好的除错环境。其它的功能,如部分符合(Partial Match只查找反白RE的部分)及除外符合(Exclude Match只不查找反白RE的部分)就留给各位大大试试啰。
当次描述用括号群组起来时,符合次描述的文字可用在之后的程序处理或RE本身。在预设的情型下,所符合的群组是由数字命名,由1开始,由顺序是由左至右,这自动群组命名,可在Expresso中的skeleton view或result view中看到。
Backreference是用来查找群组中抓取的符合文字所相同的文字。举例来说”\1”所指符合群组1所抓取的文字。
20. \b(\w+)\b\s*\1\b (寻找重复字,此处说的重复是指同样的字,中间有空白隔开如dog dog这样的字) (\w+)会抓取至少一个字符的字母或数字的字,并将它命名为群组1,之后是查找任意空格符,再接和群组1相同的文字。
如果不喜欢群组自动命名的1,也可以自行命名,以上述例子为例,(\w+)改写为(?<Word>\w+),这就是将所抓取的群组命名为Word,Backreference就要改写成为\k<Word>
21. \b(?<Word>\w+)\b\s*\k<Word>\b (使用自行命名群组抓取重复字)
使用括号还有许多特别的语法元素,比较通用的列表如下: 抓取(Captures) (exp) 符合exp并抓取它进自动命名的群组 (?<name>exp) 符合exp并抓取它进命名的群组name (?:exp) 符合exp,不抓取它 Lookarounds (?=exp) 符合字尾为exp的文字 (?<=exp) 符合前缀为exp的文字 (?!exp) 符合后面没接exp字尾的文字 (?<!exp) 符合前面没接exp前缀的文字 批注Comment (?#comment) 批注
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) (?<=exp)是一个”zero-width positive lookbehind assertion”。它指的就是符合前缀为exp的文字,但不包含exp本身。 23. (?<=\bre)\w+\b (前缀为re的字,比如说repeated所符合的就是peated) 24. (?<=\d)\d{3}\b (在字尾的三位数字,且之前接一位数字) 25. (?<=\s)\w+(?=\s) (由空格符分隔开的字母数字字符串)
Negative Lookaround 之前有提到,如何查找一个非特定或非在特定群组的字符。但如果只是要验证某字符不存在而不要对应这些字符进来呢?举个例子来说,假设要查找一个字,它的字母里有q但接下来的字母不是u,可以用下列的RE来做。
26. \b\w*q[^u]\w*\b (一个字,其字母里有q但接下来的字母不是u) 这样的RE会有一个问题,因为[^u]要对应一个字符,所以若q是字的最后一个字母,[^u]这样的下法就会将空格符对应下去 上一页 [1] [2] [3] [4] [5] [6] 下一页 |