【问题标题】:How to write a regexp pattern that is not nested inside another pattern如何编写不嵌套在另一个模式中的正则表达式模式
【发布时间】:2014-09-12 08:54:04
【问题描述】:

假设文本如下:

some text \( {{my}} \) more text \(some\) text {{my}} more text
some text {{my}} more text some text {{my}} more text

文本包含两个特殊的模式:{{...}}\(...\){{...}}模式可以嵌套在文本中的\(...\)模式中。

我的任务是编写一个正则表达式(在 php 中,所以是 PCRE 引擎),它将匹配所有未嵌套在 \(...\) 模式中的 {{..}} 模式。所以对于上面的示例文本,正则表达式应该只返回 3 个 {{...}} 模式,因为第一个模式嵌套在 \(...\) 中。

好吧,找到所有 {{...}} 的模式是 /\{\{(?P<options>.*?)\}\}/g,我在这里有一个 regex101 小提琴:http://regex101.com/r/cQ1tQ4/1

是否可以像我上面描述的那样创建一个模式?

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    最简单的方法是匹配outer whatever outer | (inner)并取捕获的组:

    \\(.+?\\)|{{(.+?)}}
    

    http://regex101.com/r/fX6sX8/3

    【讨论】:

      【解决方案2】:

      您可以通过 PCRE 动词 (*SKIP)(*F) 来做到这一点,

      \\\([^{}]*\{\{[^}]*\}\}[^\\]*\\\)(*SKIP)(*F)|\{\{(?P<options>[^}]*)\}\}
      

      DEMO

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        相关资源
        最近更新 更多