3

我有一个字符串

1234X5678

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

.X|..X|X.

我有

34X

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

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

4

1 回答 1

3

这里的要点是:

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

因此,您有一个交替模式.X|..X|X.,并针对1234X5678. 看看会发生什么

在此处输入图像描述

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

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

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

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

正则表达式引擎之前没有到达该位置,4因为该位置已被匹配和使用

还有一个结论:

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

于 2016-03-11T21:22:55.990 回答