正则表达式或模式不检索匹配

时间:2014-11-21 08:21:45

标签: regex perl

我有以下Regex Pattern

/string\s+(?|(x)|(ix|iv|v?i{0,3})|([a-j]))/i

当我在输入中使用它时

String a

我找不到a

的匹配项

如果删除中间or条件或将此条件移至模式中的较早条件,则会将其拾取。

http://regex101.com/r/uV3aL0/26

有人知道这里发生了什么吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

问题在于以下部分:

v?i{0,3}

请注意,如果缺少v且没有i,则仍会匹配。您可以通过将$添加到正则表达式的末尾来解决问题。或者,以不同的方式优化罗马数字:

/string\s+(?|(i?[xv]|v?i{1,3})|([a-j]))/i

答案 1 :(得分:1)

此行为的原因是inbetween v?i{0,3}正则表达式。如果你改变你的正则表达式,

/string\s+(?|(x)|(ix|iv|v?i{1,3})|([a-j]))/i

它会起作用。 NOrmally正则表达式引擎将从左到右采用模式。因此,在string\s+之后,它需要(x),但是没有字符x,所以这会失败。接下来转到(ix|iv|v?i{0,3})并获取第一个ix。但是没有ixiv所以这些也失败了。接下来它采用这种v?i{0,3})模式。可选的vi 0最多三次。所以一个inbetween空字符串将被匹配。所以最后我们得到了一个匹配,正则表达式引擎不会进入下一个OR条件。