在捕获组中使用逻辑或将其定义为可选项是否安全?

时间:2018-06-20 23:29:24

标签: regex pcre regex-group

如果我想使用PCRE库进行显式匹配:

A green tunic

OR

A tunic

完整表单将使用:

^A (?:green )?tunic$

使用逻辑或有什么警告吗?还是这两种形式等效?

^A (?:green |)tunic$

请注意,我只关心与该问题有关的匹配,并且保留捕获组的顺序对我来说并不重要。

1 个答案:

答案 0 :(得分:2)

它们通常是等效的,但是在某些可能的情况下它们不是等效的。

使用|时,某些正则表达式引擎“渴望”,它们使用成功的替代项列表中最左边的匹配项。结果,替代的顺序可能很重要:(This|)并不总是与(|This)相同。 regular-expression.info给出了一些具体示例。

使用?时,正则表达式引擎为“贪婪”,它尝试查找成功的最长匹配项(您可以使用??将其设为非贪婪,然后选择最短匹配项)。

实际上,这两个功能可以一起使用。上面链接的页面提供了示例:

Get|GetValue|Set|SetValue

如果输入字符串为

GetValue

一个急切的引擎只会匹配Get而不是GetValue。但是,您可以将备选方案与可选组结合使用,以使其始终找到最长的匹配项。

Get(Value)?|Set(Value)?

但是,我认为您的特定示例不会遇到这些问题。围绕替代方案的固定匹配项将其固定下来,以免产生歧义。