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时)。请参阅:)