Regex 正则表达式引擎逐个解析字符吗?

Regex 正则表达式引擎逐个解析字符吗?,regex,Regex,这样问有点荒谬。不管怎样,让我继续 在探索正则表达式时,我遇到了一个场景,其中表达式是 [A-Z0-9]+(\d\d\.\d+) 输入字符串为123.456,匹配的模式如下: 模式[A-Z0-9]+可以匹配到135,但后面没有2个数字(\d\d)和文字点字符。因此,引擎在第一个子组中使用字符23.456 正则表达式引擎是否通过一次解析一个字符来检查匹配?我是这样认为的 从这个角度看,似乎不是。引擎应该解析字符,并前后移动匹配窗口,以便帮助我们匹配结果 如果我错了,请纠正我 正则表达式引擎根据

这样问有点荒谬。不管怎样,让我继续

在探索正则表达式时,我遇到了一个场景,其中表达式是

[A-Z0-9]+(\d\d\.\d+)
输入字符串为123.456,匹配的模式如下:

模式
[A-Z0-9]+
可以匹配到135,但后面没有2个数字(
\d\d
)和文字点字符。因此,引擎在第一个子组中使用字符
23.456

正则表达式引擎是否通过一次解析一个字符来检查匹配?我是这样认为的

从这个角度看,似乎不是。引擎应该解析字符,并前后移动匹配窗口,以便帮助我们匹配结果


如果我错了,请纠正我

正则表达式引擎根据给定的模式解析字符串

您的模式是
[A-Z0-9]+(\d\d\.\d+)
。给定
123.456
字符串,首先从字符串开始尝试
[A-Z0-9]+
<首先抓取code>123(因为
+
是贪婪的量词)。然后正则表达式引擎尝试将字符串的其余部分与
(\d\d\.\d+)
匹配,但失败。之所以会发生回溯,是因为正则表达式引擎知道
[A-Z0-9]+
可以匹配字符串的不同(较小)部分,因此
3
从当前使用的字符中删除,并重试
(\d\d\.\d+)
以匹配
3.456
,但点前必须有2位。回溯再次发生

因此,只有
1
保留在捕获组1值之外

另外,请查看在生成的步骤(回溯标记为):


您的预期结果是什么?我认为您得到的结果是预期的。请查看您正在使用的站点(regex101.com)上的regex调试器,它显示了您正在询问的步骤。您可以看到,最初,它确实使用
[A-Z0-9]+
匹配了
123
,然后不得不回溯。是的,这只是预期的结果。所以,正则表达式引擎总是在必要时回溯。对吗?如果您的正则表达式允许多种方式匹配字符串,是的,当在下一步出现故障时,如果前面的子模式允许,引擎可以回溯(通常,当存在量化的子模式或lookarounds时)。请参阅:)