【问题标题】:RegEx: Smallest possible match or nongreedy match正则表达式:最小可能匹配或非贪婪匹配
【发布时间】:2010-12-27 13:25:16
【问题描述】:

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

【问题讨论】:

    标签: .net regex regex-greedy non-greedy


    【解决方案1】:

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

    regular expression quantifiers 上的文档也可能会有所帮助。

    【讨论】:

    • Line2“但除非绝对必要,否则不匹配”:这是什么意思?
    【解决方案2】:

    非贪婪运算符?。像这样:

    .*?
    

    【讨论】:

      【解决方案3】:

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

      abcabk

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

      我想实际找到可能的最小匹配项。

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

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

      a[^a]+?k
      

      const haystack = 'abcabkbk';
      const paternNonGreedy = /a.+?k/;
      const paternShortest = /a[^a]+?k/;
      
      const matchesNonGreedy = haystack.match(paternNonGreedy);
      const matchesShortest = haystack.match(paternShortest);
      
      console.log('non greedy: ',matchesNonGreedy[0]);
      console.log('shortest: ', matchesShortest[0]);

      【讨论】:

      • 或倒序搜索,从末尾开始,匹配嵌套时:“(ab(abk)bk)”。
      • @LBogaardt 如何以相反的顺序搜索?不明白
      • 反转字符串,然后应用正则表达式。
      • @C4u 试试c[^cb]*b,它会匹配cb之间的最短路径
      • 这非常有用。对于像我这样试图了解这里发生了什么的人来说,通用形式是START[^START]*?END(其中 START 和 END 是您的开始和结束字符正则表达式)。它本质上意味着“匹配从 START 到 END 之间的字符不再包含 START 的任何内容”
      猜你喜欢
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      相关资源
      最近更新 更多