Skip to content

正则表达式之lookaround

04月 1, 2009

正则表达式中的lookaround,类似形如\b、^、或者$这样的metacharacters,它们不匹配文本,而是匹配文本中的位置

lookaround又分为lookahead和lookbehind。
(>=Jeffrey)匹配下面的标记的位置:
by regJeffrey 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

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Connecting to %s

加关注

Get every new post delivered to your Inbox.