2016-11-30 84 views
0

,我读了正则表达式Perl的正则表达式字边界等价

\ba 

相当于

(?<!\w)a 

但在此之前,我已经想通了,也许

^a|\Wa 

相当于太

我的问题是:Wha t是这两者之间的差异吗?如果他们不相同,有人可以写一个例子吗?

+0

'(?<!\ w)'只匹配一个单词的开头,其中'\ b'将在单词的任一末尾处断言。 – dawg

+0

@dawg是的,但是'a'是一个单词字符,这意味着在'\ ba'中'\ b'只能通过非单词在左边的情况来满足。 – hobbs

回答

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 '[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; # !#$ 
+0

另一个例子:'说出'!a !!' =〜/(!| \ ba)/ g;' – ikegami

+0

如果我不处理子匹配,但只与整个字符串匹配,是我的“解决方案”好吗?你怎么看?我在写一个只识别L(正则表达式)集合的NFA。 –

+0

编号'say“!a”=〜/^[x!](?:\ ba | b)\ z /? “匹配”:“不匹配”;'。 (这并不意味着不用'\ b'来重写模式是不可能的。) – ikegami

0

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

这是最短的例子,我可以提供他们为什么不等价的。

+0

'!'是一个非单词字符,所以我认为你错了,正则表达式'\ Wa'匹配字符串'!a' –

+0

你是对的,我把它写回来了。 –