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