regex - 为什么正则表达式引擎选择从 `..X` 匹配模式 `.X|..X|X.`?

标签 regex alternation

我有一个字符串

1234X5678

我使用这个正则表达式来匹配模式

.X|..X|X.

我得到了

34X

问题是为什么我没有得到 4XX5

为什么正则表达式选择执行第二种模式?

最佳答案

这里的重点是:

正则表达式引擎默认从左到右分析输入。

因此,您有一个交替模式 .X|..X|X. 并针对 1234X5678 运行它。 See what happens :

enter image description here

每个替代分支都针对字符串中从左到右的每个位置进行测试

前 1-7 步显示引擎如何尝试匹配字符串开头的字符。但是,所有分支(.X..XX. 均不匹配 12123).

步骤 8-13 只是重复相同的失败场景,因为没有分支匹配 23234

步骤 14-19 显示了一个成功的场景,因为 34X 可以与 Branch 2 (..X) 匹配。

正则表达式引擎不会到达 4 之前的位置,因为该位置被匹配并消耗

还有一个结论:

交替的顺序很重要,在 NFA 正则表达式引擎中,第一个匹配的替代方案获胜,但这个替代方案不必是第一个最短的替代方案,一个更长的替代方案 匹配beginning 可以匹配得更早。

关于regex - 为什么正则表达式引擎选择从 `..X` 匹配模式 `.X|..X|X.`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35946342/

相关文章:

正则表达式:删除除第一个字符和最后一个数字之外的所有内容

r - 从 R 中的数字和字母列表中分离多个数字

r - 如何交替使用向量列表(正则表达式)

regex - 在正则表达式中使用交替时 Perl 未初始化值

regex - 可以将包含有序交替的正则表达式重写为仅使用无序交替吗?

javascript - 验证正则表达式输入字段

regex - "Untranslatable"正则表达式语法

java - 仅保留数字、字母并删除空格

java - Java 正则表达式和交替的问题

ruby - 为什么不匹配交替中更长的标记?