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

Why regex engine choose to match pattern `..X` from `.X|..X|X.`?

我有一个字符串

1234X5678

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

.X|..X|X.

我得到了

34X

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

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

这里的重点是:

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

因此,您有一个交替模式 .X|..X|X. 并且您 运行 它反对 1234X5678See what happens:

从左到右针对字符串中的每个位置测试每个备选分支

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

步骤 8-13 只是重复与 none 分支匹配 23234.

相同的失败场景

步骤 14-19 显示成功场景,因为 34X 可以与分支 2 (..X) 匹配。

正则表达式引擎没有到达 4 之前的位置,因为这个位置被匹配并且 consumed.

还有一个结论:

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