Regex 惰性匹配未按预期工作

Regex 惰性匹配未按预期工作,regex,Regex,我有以下字符串: abc1def1ghij2klmc 我正在尝试构建一个正则表达式,它提取1到2之间最短的(惰性)字符串。在上面的示例中,我需要提取1ghij2 正则表达式1.*2匹配1def1ghij2 惰性正则表达式1.*.2匹配1def1ghij2 如何提取1和2之间的最短字符串 我希望在这里工作。也许我误解了懒惰匹配的概念 1[^12]*2 您可以详细了解原始模式的匹配工作原理,所有正则表达式引擎步骤都是一个接一个的,请参见: 用人类语言解释此正则表达式运行: 正则表达式引擎

我有以下字符串:

abc1def1ghij2klmc
我正在尝试构建一个正则表达式,它提取1到2之间最短的(惰性)字符串。在上面的示例中,我需要提取
1ghij2

正则表达式
1.*2
匹配
1def1ghij2

惰性正则表达式
1.*.2
匹配
1def1ghij2

如何提取1和2之间的最短字符串

我希望在这里工作。也许我误解了懒惰匹配的概念

1[^12]*2    
您可以详细了解原始模式的匹配工作原理,所有正则表达式引擎步骤都是一个接一个的,请参见:

用人类语言解释此正则表达式运行: 正则表达式引擎检查您的目标文本,检查您的模式是否匹配某些内容,从文本的开头(字母“a”)开始,然后继续一个字符接着一个字符向右,直到第一个“1”,匹配它,然后继续匹配一个字符接着一个字符,并将它们全部匹配到“2”包括…在内因此,第二个“1”也是匹配的。请参阅上面包含的链接以查看其实际操作

您可以尝试将另一个“2”放在现有“2”的右侧,在regex101.com中运行您的原始模式,您可以看到它与之前的相同字符串匹配,而不是扩展它-在本例中,惰性功能以这种方式工作


希望这有帮助:)

试试
1[^12]*2
。也就是说,查找以
1
开头、不包含
1
2
且以
2
结尾的子字符串。这行吗?试试
1[^12]*2
。希望这能有所帮助。我的想法是:惰性限定符告诉正则表达式何时可以停止。使用
1.*2
,一旦引擎找到1,它将继续运行,直到找到
2
-因此它将匹配
11111112
。获得所需的一种方法是,如建议的那样,在起始
1
和最终
2
之间不允许
1
2
。由于正则表达式引擎不需要回溯,求反字符类也会更快。作为选项:
[^1]*?(?=2)
,尽管它不捕获
1
2
(即仅内部文本)