,我读了正则表达式Perl的正则表达式字边界等价
\ba
相当于
(?<!\w)a
但在此之前,我已经想通了,也许
^a|\Wa
相当于太
我的问题是:Wha t是这两者之间的差异吗?如果他们不相同,有人可以写一个例子吗?
,我读了正则表达式Perl的正则表达式字边界等价
\ba
相当于
(?<!\w)a
但在此之前,我已经想通了,也许
^a|\Wa
相当于太
我的问题是:Wha t是这两者之间的差异吗?如果他们不相同,有人可以写一个例子吗?
\b
相当于(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))
,所以
\ba
相当于(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))a
,所以
\ba
相当于(?<!\w)a
因为a
匹配\w
。
两个\ba
和(?<!\w)a
类似于既^a|\Wa
和(?:^|\W)a
到的是偶尔可互换的点,但它们是不同的,因为前两者匹配单个字符和后两者可以匹配两个。比较:
say '[email protected]#$' =~ s/\ba//r; # [email protected]#$
say '[email protected]#$' =~ s/(?<!\w)a//r; # [email protected]#$
say '[email protected]#$' =~ s/^a|\Wa//r; # !#$
say '[email protected]#$' =~ s/(?:^|\W)a//r; # !#$
\ba
将匹配a
的字符串!a
而^a|\Wa
将匹配!a
这是最短的例子,我可以提供他们为什么不等价的。
'!'是一个非单词字符,所以我认为你错了,正则表达式'\ Wa'匹配字符串'!a' –
你是对的,我把它写回来了。 –
'(?<!\ w)'只匹配一个单词的开头,其中'\ b'将在单词的任一末尾处断言。 – dawg
@dawg是的,但是'a'是一个单词字符,这意味着在'\ ba'中'\ b'只能通过非单词在左边的情况来满足。 – hobbs