在捕获组中使用逻辑 OR 将其定义为可选是否安全?
Is it safe to use a logical OR in a capture group to define it as optional?
如果我想使用 PCRE 库显式匹配:
A green tunic
或
A tunic
完整的形式是使用:
^A (?:green )?tunic$
使用逻辑或是否有任何注意事项或者这两种形式是否等效?
^A (?:green |)tunic$
请注意,我只关心检测与此问题相关的匹配项,保留捕获组的顺序对我来说并不重要。
它们通常是等价的,但在某些情况下它们可能不是等价的。
当使用 |
时,一些正则表达式引擎是 "eager",它们使用成功的替代列表中最左边的匹配项。因此,备选方案的顺序可能很重要:(This|)
并不总是与 (|This)
相同。 regular-expression.info 给出了一些具体的例子。
当使用 ?
时,正则表达式引擎是 "greedy",它会尝试找到成功的最长匹配(您可以使用 ??
使其成为非贪婪的,然后它更喜欢最短的匹配)。
其实这两个功能是可以一起使用的。上面链接的页面给出了示例:
Get|GetValue|Set|SetValue
如果输入的字符串是
GetValue
eager 引擎只会匹配 Get
而不是 GetValue
。但是您可以将备选方案与可选组结合使用,以使其始终找到最长的匹配项。
Get(Value)?|Set(Value)?
不过,我不认为你的具体例子会遇到这些问题。围绕备选方案的固定匹配将其锚定,因此没有歧义。
如果我想使用 PCRE 库显式匹配:
A green tunic
或
A tunic
完整的形式是使用:
^A (?:green )?tunic$
使用逻辑或是否有任何注意事项或者这两种形式是否等效?
^A (?:green |)tunic$
请注意,我只关心检测与此问题相关的匹配项,保留捕获组的顺序对我来说并不重要。
它们通常是等价的,但在某些情况下它们可能不是等价的。
当使用 |
时,一些正则表达式引擎是 "eager",它们使用成功的替代列表中最左边的匹配项。因此,备选方案的顺序可能很重要:(This|)
并不总是与 (|This)
相同。 regular-expression.info 给出了一些具体的例子。
当使用 ?
时,正则表达式引擎是 "greedy",它会尝试找到成功的最长匹配(您可以使用 ??
使其成为非贪婪的,然后它更喜欢最短的匹配)。
其实这两个功能是可以一起使用的。上面链接的页面给出了示例:
Get|GetValue|Set|SetValue
如果输入的字符串是
GetValue
eager 引擎只会匹配 Get
而不是 GetValue
。但是您可以将备选方案与可选组结合使用,以使其始终找到最长的匹配项。
Get(Value)?|Set(Value)?
不过,我不认为你的具体例子会遇到这些问题。围绕备选方案的固定匹配将其锚定,因此没有歧义。