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
这是我能提供的为什么它们不等同的最短示例。
我读到正则表达式
\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
这是我能提供的为什么它们不等同的最短示例。