gpt4 book ai didi

regex - 零长度正则表达式和无限匹配?

转载 作者:行者123 更新时间:2023-12-04 05:11:56 26 4
gpt4 key购买 nike

在尝试详细说明this问题时,我现在尝试了解零长度正则表达式的行为/含义。

我经常将www.regexr.com用作游乐场来测试/调试/理解正则表达式中发生的事情。

因此,我们有一个最平淡的场景:

正则表达式为a*
输入的字符串是dgwawa(事实上​​,这里的字符串是无关紧要的)

为什么报告此正则表达式将无限匹配的这种行为,因为它匹配零次出现的前一个字符?

为什么结果不能是6个匹配项,每个字符位置一个匹配项(因为每个字符,无论是否为a,都存在一个匹配项,因为零个匹配项是匹配项)?

它如何进入无限匹配?因此,它不会一次检查/处理字符吗?

我不知道它如何/在哪里陷入无限循环。

enter image description here

最佳答案

您在regexr.com在线正则表达式测试器中选择了JavaScript正则表达式。当传递可以匹配空字符串的模式时,JavaScript regex引擎不会自动移动索引。

这就是为什么当您需要模拟在.NET Regex.Matches,PHP preg_match_all,Python re.finditer等中观察到的行为时,需要手动推进索引以测试每个位置的原因。

参见regex101.com test:

var re = /a*/g; 
var str = 'dgwawa';
var m;

while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) { // <- this part
re.lastIndex++; // <- here
} // <- is important
document.body.innerHTML += "'" + m[0] + "'<br/>";
}


如果删除该 if块,则会出现无限循环。

在这方面有两点非常重要的事情要提到:
  • 始终对您的编程语言使用适当的在线正则表达式测试仪
  • 避免使用可以匹配空字符串的未 anchor 定模式
  • 关于regex - 零长度正则表达式和无限匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495675/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com