Perl-regex 词边界等价

Perl-regex word boundary equivalence

我读到正则表达式

\ba

等同于

(?<!\w)a

但在那之前我发现也许

^a|\Wa

也等价

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

\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;   # !#$

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

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