我有一串
1234X5678
我用这个正则表达式来匹配模式
.X|..X|X.
我有
34X
问题是,为什么我没有拿到4X
或X5
?
为什么正则表达式选择执行第二种模式?
这里的重点是:
Regex引擎默认情况下会分析从LEFT TO RIGHT的输入。
因此,您有一个交替模式,.X|..X|X.
并且对它进行了操作1234X5678
。看看会发生什么:
从字符串的左到右分别对每个分支进行测试。
最初的1-7个步骤显示了引擎如何尝试匹配字符串开头的字符。然而,没有分支(既不的.X
,也不是..X
,也不X.
匹配12
或123
)。
步骤8-13只是重复相同的失败情况,因为没有分支匹配23
或匹配234
。
步骤14-19显示了成功的情况,因为34X
可以与分支2(..X
)匹配。
正则表达式引擎无法到达该位置,4
因为该位置已被匹配并被消耗。
另一个结论是:
交替的顺序很重要,在NFA regex引擎中,第一个替代匹配获胜,但该替代不必是第一个最短的匹配,更长的替代匹配开头的相同字符可以更早匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句