Perl-regex词边界等价

时间:2016-11-30 19:48:45

标签: regex perl equivalence word-boundary

我读到了正则表达式

\ba

相当于

(?<!\w)a

但在此之前我已经想出可能

^a|\Wa

也是等同的

我的问题是:这两者有什么区别?有人可以写一个例子,如果它们不相同吗?

2 个答案:

答案 0 :(得分:2)

\b相当于(?:(?<!\w)(?=\w)|(?<=\w)(?!\w)),所以

\ba相当于(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))a,所以

\ba相当于(?<!\w)a,因为a\w匹配。

\ba(?<!\w)a都与^a|\Wa(?:^|\W)a类似,偶尔可以互换,但它们不同,因为前两个匹配单个字符而后两者可以匹配两个。比较:

say '!@a#$' =~ s/\ba//r;         # !@#$

say '!@a#$' =~ s/(?<!\w)a//r;    # !@#$

say '!@a#$' =~ s/^a|\Wa//r;      # !#$

say '!@a#$' =~ s/(?:^|\W)a//r;   # !#$

答案 1 :(得分:0)

\ba会将a与字符串!a匹配 而^a|\Wa将匹配!a

这是我能提供的最短的例子,为什么它们不等同。