如果我想使用PCRE库进行显式匹配:
A green tunic
OR
A tunic
完整表单将使用:
^A (?:green )?tunic$
使用逻辑或有什么警告吗?还是这两种形式等效?
^A (?:green |)tunic$
请注意,我只关心与该问题有关的匹配,并且保留捕获组的顺序对我来说并不重要。
答案 0 :(得分:2)
它们通常是等效的,但是在某些可能的情况下它们不是等效的。
使用|
时,某些正则表达式引擎“渴望”,它们使用成功的替代项列表中最左边的匹配项。结果,替代的顺序可能很重要:(This|)
并不总是与(|This)
相同。 regular-expression.info给出了一些具体示例。
使用?
时,正则表达式引擎为“贪婪”,它尝试查找成功的最长匹配项(您可以使用??
将其设为非贪婪,然后选择最短匹配项)。
实际上,这两个功能可以一起使用。上面链接的页面提供了示例:
Get|GetValue|Set|SetValue
如果输入字符串为
GetValue
一个急切的引擎只会匹配Get
而不是GetValue
。但是,您可以将备选方案与可选组结合使用,以使其始终找到最长的匹配项。
Get(Value)?|Set(Value)?
但是,我认为您的特定示例不会遇到这些问题。围绕替代方案的固定匹配项将其固定下来,以免产生歧义。