RegEx:最小可能匹配或非同意匹配

Jon*_*len 90 .net regex

如何告诉RegEx(.NET版本)获得最小的有效匹配而不是最大的?

DMI*_*DMI 172

对于像.*或的正则表达式.+,附加一个问号(.*?.+?)以匹配尽可能少的字符.(?:blah)?除非绝对必要,否则可选择匹配某个部分但不匹配,请使用类似的内容(?:blah){0,1}?.对于重复匹配(使用{n,}{n,m}语法)附加问号以尝试尽可能少地匹配(例如{3,}?{5,7}?).

关于正则表达式量词的文档也可能有所帮助.

  • 我不知道,如果我是唯一有这种误解的人,但重要的是要注意:虽然非贪婪的算子确实匹配尽可能少的字符,但它仍然可能不是匹配的人对于."尽可能少的字符"不等于RegEx标准的"最短匹配".请参阅我的评论下面的答案:使用`abcabk`和`a.+?k`,RegEx将匹配整个字符串. (6认同)
  • 第2行“但除非绝对必要,否则不匹配”:这是什么意思? (2认同)

Dav*_*und 66

非贪婪的运营商?.像这样:

.*?
Run Code Online (Sandbox Code Playgroud)


Jon*_*han 36

非贪婪的运算符并不意味着最短的匹配:

abcabk

a.+?k 将匹配整个字符串(在此示例中)而不是仅匹配最后三个符号.

我想找到最小的可能匹配.

这是' a'仍然允许所有匹配的最后一个可能的匹配k.

我想这样做的唯一方法是使用如下表达式:

a[^a]+?k
Run Code Online (Sandbox Code Playgroud)

  • @LBogaardt如何以相反的顺序搜索?不明白 (6认同)
  • @C4u 试试 `c[^cb]*b`,它会匹配 `c` 和 `b` 之间的最短路径 (4认同)
  • 这非常有帮助。对于像我这样试图了解这里发生的事情的人来说,通用形式是“START[^START]*?END”(其中 START 和 END 是您的开始和结束字符正则表达式)。它本质上意味着“匹配从 START 到 END 的任何内容,其中中间字符不再次包含 START” (3认同)
  • 我想这只有当 START 是单个字符时才有效? (3认同)
  • 或者,当嵌套有匹配项时,从末尾开始以相反的顺序搜索:“(ab(abk)bk)”。 (2认同)
  • @LBogaardt仍然悬而未决的问题:如何以相反的顺序搜索?让我们说我想要`cab`.如果我的输入是'caaacab`并且我搜索`a.*?b`它将返回完整的字符串而不是内部的短匹配.我如何从`b`向后搜索? (2认同)
  • 反转字符串,然后应用正则表达式。 (2认同)