【问题标题】:How to non-greedy multiple lookbehind matches如何进行非贪婪的多个lookbehind匹配
【发布时间】:2009-08-05 09:49:06
【问题描述】:
Source:    <prefix><content1><suffix1><prefix><content2><suffix2>
Engine:    PCRE

RegEx1:    (?<=<prefix>)(.*)(?=<suffix1>)
RegEx2:    (?<=<prefix>)(.*)(?=<suffix2>)

Result1:   <content1>
Result2:   <content1><suffix1><prefix><content2>

RegEx2 的期望结果只是 但它显然是贪婪的。 如何使 RegEx2 不贪婪并仅使用最后一个匹配的lookbehind?

[我希望我已经从 NoteTab 语法正确地翻译了这个。我不做 很多正则表达式编码。 术语只是用来表示任意字符串。只有 "?

我怀疑这很简单,但经过太多小时的搜索后,我 放弃自己解决。

感谢您的帮助

艺术

【问题讨论】:

    标签: regex lookbehind non-greedy


    【解决方案1】:

    我建议你使用:

    (?<=<prefix>)(((?!<prefix>).)*)(?=<suffix2>)
    

    这可以确保匹配中没有&lt;prefix&gt;。完整匹配结果为&lt;content2&gt;

    【讨论】:

      【解决方案2】:

      把贪婪的东西放在它前面?

      (?:.*)(?<=<prefix>)(.*)(?=<suffix2>)
      

      由于贪婪的(?:.*) 会尽可能多地吞噬,因此只有最小值会与模式的其余部分匹配——实际上使其余部分不贪婪。

      非贪婪的.*? 也可能有效:

      (?<=<prefix>)(.*?)(?=<suffix2>)
      

      【讨论】:

      • 第一个正则表达式看起来不错(当然你需要使用 \1 而不是整个匹配),第二个将不起作用。它仍然会匹配太多(因为第一个可能的匹配获胜,长匹配仍然可能)。
      • 是的,我不确定第二个,因此是“可能”。
      • 谢谢戴夫。我会试一试,但我希望 RegEx 有一些更优雅的东西,比如某种类似于子模式编号的相对标识符。
      【解决方案3】:

      我也遇到了同样的问题。但在我的情况下是

      (?<=<prefix>)(?:.(?!<prefix>))*(?=<suffix>)
      

      这就是我想要的。

      此表达式将匹配 &lt;prefix&gt;&lt;suffix&gt; 之间的字符串联并且不包含子字符串 &lt;prefix&gt; 的任何内容。 (我想是的。我不太擅长正则表达式。)

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多