【问题标题】:Why regex engine choose to match pattern `..X` from `.X|..X|X.`?为什么正则表达式引擎从`.X|..X|X.`中选择匹配模式`..X`?
【发布时间】:2016-03-11 17:26:50
【问题描述】:

我有一个字符串

1234X5678

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

.X|..X|X.

我明白了

34X

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

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

【问题讨论】:

  • 您的预期输出是什么? 1234,5678?
  • 因为这不是正则表达式引擎(传统 NFA)的工作方式。
  • 快速猜测——正则表达式正在尝试贪婪匹配?
  • 使用or 它应该匹配第一个模式并忽略其余的因为true|... == true 不需要评估第二个模式。
  • 我喜欢这些问题。我在一小时前回答了类似的问题。请检查。 正则表达式引擎从左到右分析输入。这不是您使用的原子组。 POSIX 也会在这里返回相同的结果。

标签: regex alternation


【解决方案1】:

这里的重点是:

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

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

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

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

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

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

正则表达式引擎无法到达4 之前的位置,因为该位置已被匹配并使用

还有一个结论:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2011-11-24
  • 2012-04-13
相关资源
最近更新 更多