正则表达式之lookaround
04月 1, 2009
正则表达式中的lookaround,类似形如\b、^、或者$这样的metacharacters,它们不匹配文本,而是匹配文本中的位置。
lookaround又分为lookahead和lookbehind。
(>=Jeffrey)匹配下面的标记的位置:
by
Jeffrey Friedl
书中有个例子,把Jeffs替换为Jeff’s。
| 方法 | 解释 |
| s/\bJeffs\b/Jeff’s/g | 最直接的方法 |
| s/\b(Jeff)(s)\b/$1′$2/g | 杀鸡用牛刀 |
| s/\bJeff(?=s\b)/Jeff’/g | 按照作者的意思,只是为了说明lookahead,实际用处不大 |
| s/(?<=\bJeff)(?=s\b)/’/g | 这个表达式没有consume任何文本,它找到这样的一个位置——前面是一个单词起始,紧接着Jeff,后面是字符s,紧接着单词的起始。然后把这个位置替换为引号’ |
| s/(?=s\b)(?<=\bJeff)/’/g | 和上面的类似,只不过两个字表达式的顺序颠倒了一下,因为他们并不consume文本,所以顺序是无关的。 |
接着是一个实际的例子,把数字转化为特定的格式:#,###,###。
思路就是:
找到这样的一个位置——它的左边有数字,右边是n个3位一组的数字(n>=1)。
$pop =~ s/(?<=\d)(?=(\d\d\d)+$)/,/g;
如果不加最后的$,会解释为:左边有一个数字,右边至少有3位数字。结果就如下:
1,2,3,4,5,678
当然,如果分组不对,同样有问题。
lookaround还有相应的“否定”形式:(?<!……)和(?!......)
TODO
undef $/;
No comments yet