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