我有一个字符串
1234X5678
我使用这个正则表达式来匹配模式
.X|..X|X.
我得到了
34X
问题是为什么我没有得到 4X
或 X5
?
为什么正则表达式选择执行第二种模式?
最佳答案
这里的重点是:
正则表达式引擎默认从左到右分析输入。
因此,您有一个交替模式 .X|..X|X.
并针对 1234X5678
运行它。 See what happens :
每个替代分支都针对字符串中从左到右的每个位置进行测试。
前 1-7 步显示引擎如何尝试匹配字符串开头的字符。但是,所有分支(.X
、..X
和 X.
均不匹配 12
或123
).
步骤 8-13 只是重复相同的失败场景,因为没有分支匹配 23
或 234
。
步骤 14-19 显示了一个成功的场景,因为 34X
可以与 Branch 2 (..X
) 匹配。
正则表达式引擎不会到达 4
之前的位置,因为该位置被匹配并消耗。
还有一个结论:
交替的顺序很重要,在 NFA 正则表达式引擎中,第一个匹配的替代方案获胜,但这个替代方案不必是第一个最短的替代方案,一个更长的替代方案 匹配beginning 可以匹配得更早。
关于regex - 为什么正则表达式引擎选择从 `..X` 匹配模式 `.X|..X|X.`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35946342/