Perl正则表达式 - (x|y)* 是否等同于 [xy]*?

22
正如标题所说,正则表达式模式(x|y)*是否与[xy]*匹配相同的字符串?

1
仅适用于极为受限的可能值 xy。请参见我的下面的评论。 - tchrist
2个回答

34

是的,它们匹配完全相同的字符串集。

它们并不等价。 (x|y)* 设置了backreference[xy]*没有。

因此,(?:x|y)*[xy]*在行为上是等效的,因为两者都没有设置后向引用。


我们称字符串集合为“语言”。 - mike3996
4
实际上,只有当 xy 都解析为单个码点,并且在正则表达式中以及方括号字符类内部相同时,它们才匹配相同的字符串。因此,如果 xabc,而 ydef,它将不起作用。如果其中任何一个是像 .\b 或者 \R 这样的复杂内容,也将无法工作。 - tchrist
2
@tchrist 我把 xy 理解为字面上的 "x" 和 "y",因为他没有说 $x$y。但我可能是错的。请问楼主能否澄清一下? - mpeters

13
这两种形式基本等价,但第一种形式从由 ( ) 分隔的 中进行 捕获,可以在 regex 匹配时使用 $1(对于第一个)进行检索。
如果要避免捕获,请使用。
(?:re)

其中re表示正则表达式。

注意

仅当xy确切地为xy时,此方法才有效,如果它们是一般的正则表达式,则无效。

请参见回溯


2
即使如此,这仅在xy确切地是xy时才起作用,而不是它们是一般的正则表达式。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接