我有以下Regex Pattern
/string\s+(?|(x)|(ix|iv|v?i{0,3})|([a-j]))/i
当我在输入中使用它时
String a
我找不到a
如果删除中间or
条件或将此条件移至模式中的较早条件,则会将其拾取。
http://regex101.com/r/uV3aL0/26
有人知道这里发生了什么吗?
感谢您的帮助。
答案 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
。但是没有ix
或iv
所以这些也失败了。接下来它采用这种v?i{0,3})
模式。可选的v
和i
0最多三次。所以一个inbetween空字符串将被匹配。所以最后我们得到了一个匹配,正则表达式引擎不会进入下一个OR条件。