【问题标题】:Regular Expression, match characters between { }正则表达式,匹配 { } 之间的字符
【发布时间】:2010-07-28 23:18:17
【问题描述】:

我正在尝试查找在 { } 之间包含 的文本。这是在 HTML 中,我很难让它变得“不贪婪”。

所以我想找到与这些字符串匹配的文本:

{test > 3}
{testing >= 3 : comment}
{example < 4}

我已经尝试了许多正则表达式,但似乎所有的都在结束 } 之后继续,包括具有 的 HTML。例如,我尝试了这个正则表达式

{.*?(<|>).*?}

但最终会匹配这样的文本:

{if true}<b>testing</b>{/if}

看起来很简单,{ } 之间包含 的任何文本。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    这应该可以解决问题:

    {[^}]*(<|>).*}
    

    【讨论】:

    • 我投了赞成票,但你真的需要让 .* 匹配惰性或用另一个 [^}]* 替换它,以避免在同一行上有多个集合时出现贪婪问题.
    • 你需要 ungreedy 修饰符,否则第一个字符类将吞噬所有内容,直到第一个 } 字符...
    • 刚刚添加了一个?在 .* 之后使其变得贪婪,并且它可以在同一行上的多个匹配项中正常工作。
    【解决方案2】:

    更高效的正则表达式(因为没有非贪婪匹配):

    '#{[^}<>]*[<>]+[^}]*}#'
    

    第三个字符类中没有括号的原因是它匹配多个>的字符串(例如{foo &lt;&gt; bar}...

    【讨论】:

      【解决方案3】:
      {[^}]*?(<|>)[^{]*?}
      

      试试看。请注意,我将 .s 替换为一个字符类,这意味着除了左/右花括号之外的所有内容。

      【讨论】:

        【解决方案4】:

        您是否尝试过使用 Ungreedy (U) 开关?

        【讨论】:

          猜你喜欢
          • 2016-09-02
          • 2010-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-19
          • 2019-05-09
          • 1970-01-01
          • 2012-09-26
          相关资源
          最近更新 更多