我有一个字符串
1234X5678
我使用这个正则表达式来匹配模式
.X|..X|X.
我有
34X
问题是为什么我没有得到4X
or X5
?
为什么正则表达式选择执行第二种模式?
我有一个字符串
1234X5678
我使用这个正则表达式来匹配模式
.X|..X|X.
我有
34X
问题是为什么我没有得到4X
or X5
?
为什么正则表达式选择执行第二种模式?
这里的要点是:
正则表达式引擎默认分析从左到右的输入。
因此,您有一个交替模式.X|..X|X.
,并针对1234X5678
. 看看会发生什么:
每个替代分支都针对字符串中从左到右的每个位置进行测试。
前 1-7 步显示了引擎如何尝试匹配字符串开头的字符。但是,没有任何分支(既不.X
、..X
也不X.
匹配12
或123
)。
步骤 8-13 只是重复相同的失败场景,因为没有任何分支匹配23
或234
.
步骤 14-19 显示了一个成功的场景,因为34X
可以与分支 2 ( ..X
) 匹配。
正则表达式引擎之前没有到达该位置,4
因为该位置已被匹配和使用。
还有一个结论:
交替的顺序很重要,在 NFA 正则表达式引擎中,第一个匹配的替代方案获胜,但是这个替代方案不必是第一个最短的替代方案,在开始时匹配相同字符的更长的替代方案可以更早地匹配。