正则表达式歧义

use*_*875 5 regex

关于正则表达式机制的基本问题:

我有以下表达式:[10]*1[10]*.

这会匹配100吗?

我的推理:
第一个选项:[10]*匹配“100”然后到达字符串的末尾=> 不匹配。
第二个选项:[10]*被忽略并且表达式匹配。

我忘记了一些小事,还是这实际上取决于正则表达式引擎?
(我记得关于贪婪与不贪婪的一些事情,但我不确定这是否适用于这种情况)

Mar*_*der 2

正则表达式引擎进行回溯。

引擎尝试与 匹配100,[10]*但这不起作用,因为然后1没有任何可匹配的内容。但随后引擎会丢弃重复的最后一个字符(仅使用[10]*for 10)并再次尝试。仍然不起作用,因为1不匹配0。引擎一次会丢弃一个角色,直到第一个角色[10*]完全丢弃。现在1匹配并且[10]*很高兴匹配其余的。

我建议阅读本教程,因为它很好地解释了幕后发生的事情。(对于您的特定问题,请查看“重复”部分)。

更多细节:

这并不取决于重复是贪婪的还是非贪婪的。正则表达式引擎将始终回溯。[10]如果你像这样让它变得不贪婪,它就会从另一端开始( 出现 0 次): [10]*?。在这种情况下,这会加快该过程,因为第一次尝试已经匹配,但它不会改变它始终匹配的事实。

事实上,您可以通过使重复“占有”来手动防止引擎回溯。如果您这样做,并且首先留下重复,那么引擎将不会尝试其他可能的重复。这将是语法:[10]*+。现在引擎将100仅与第一部分匹配。那么匹配1就会失败,但是由于您将重复设置为所有格,因此它不会回去尝试使用不同的选项[10]*。当然,在这种情况下这是无用的,但在某些用例中这种行为是可取的。所有这些都包含在链接的教程中。;)