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

Regex 零长度正则表达式和无限匹配?,regex,Regex,在试图详细说明这个问题的答案时,我现在试图了解零长度正则表达式的行为/含义 我经常使用www.regexr.com作为测试/调试/理解正则表达式的平台 所以我们有一个最平庸的场景: 正则表达式是a* 输入字符串为dgwawa (事实上,这里的字符串是不相关的) 既然这个正则表达式与前面字符的零次匹配,为什么要报告这个正则表达式将无限匹配呢 为什么结果不能是6个匹配,每个字符位置一个(因为在每个字符上,不管它是否是a,都有一个匹配,因为零个匹配就是一个匹配) 它是如何进入无限匹配的?所以它不会一次

在试图详细说明这个问题的答案时,我现在试图了解零长度正则表达式的行为/含义

我经常使用www.regexr.com作为测试/调试/理解正则表达式的平台

所以我们有一个最平庸的场景:

正则表达式是
a*

输入字符串为
dgwawa
(事实上,这里的字符串是不相关的)

既然这个正则表达式与前面字符的零次匹配,为什么要报告这个正则表达式将无限匹配呢

为什么结果不能是6个匹配,每个字符位置一个(因为在每个字符上,不管它是否是a,都有一个匹配,因为零个匹配就是一个匹配)

它是如何进入无限匹配的?所以它不会一次检查/处理一个角色

我想知道它是如何/从何处进入无限循环的


实际上有7个匹配项

让我列举一下,第一个数字是起点(基于0),第二个数字是长度

Match 1:             0       0   
Match 2:             1       0   
Match 3:             2       0   
Match 4:    a        3       1   
Match 5:             4       0   
Match 6:    a        5       1   
Match 7:             6       0   
我使用regex101,它实现了我们大多数人对这个简单regex的期望(考虑到存在regex方言)


您在regexr.com online regex tester上选择了JavaScript regex flavor。当传递与空字符串匹配的模式时,JavaScript正则表达式引擎不会自动移动索引

这就是为什么当您需要模拟.NET
Regex.Matches
、PHP
preg\u match\u all
、Python
re.finditer
等中观察到的行为时,需要手动推进索引以测试每个位置

见:

var re=/a*/g;
var str='dgwawa';
var-m;
while((m=re.exec(str))!==null){

如果(m.index==re.lastIndex){//如果站点报告7,我会很高兴,我的问题是报告“无限”匹配?!我想你会喜欢的,但我担心机制不能像那样工作。很好。在regexr遵循特定的regex风格之前,我就被告知了。我应该更认真地考虑这一点。请参阅部分选择你需要的一个。感谢完整的答案和见解!做得很好。只是为了记录,只有一个沙盘ox用于.NET regex测试,与regexr相比,它要差得多。因此,我坚持使用regexr,并牢记最高意识:)用于测试.NET应用程序,您可以使用和。如果您需要像.NET的regex101.com这样的功能,请使用一个非常好的免费应用程序,名为。