【问题标题】:Regex for find value between curly braces which have pipe separator正则表达式在具有管道分隔符的花括号之间查找值
【发布时间】:2022-01-13 03:43:21
【问题描述】:
$str = ({max_w} * {max_h} * {key|value}) / {key_1|value}

我有上面的公式,我想用花括号匹配这个值,它有一个管道分隔符。现在的问题是它给了我没有管道分隔符的值。我是正则表达式的新手,所以对此不太了解。我试过下面一个

preg_match_all("^\{(|.*?|)\}^",$str, PREG_PATTERN_ORDER);

它给出以下输出

Array
(
    [0] => key|value
    [1] => max_w
    [2] => max_h
    [3] => key_1|value
)

预期输出

Array
(
    [0] => key|value
    [1] => key_1|value
)

【问题讨论】:

    标签: php regex


    【解决方案1】:

    不确定 PHP。这是执行此操作的通用正则表达式。

    {([^{}]*\|[^{}]*)}
    

    这里是demo

    【讨论】:

    • 第二个[^{}]*?不必偷懒。
    • 是的,但接下来的问题是在哪里停止第一个 [^{}]*,在第一个 | 之前,还是在 {} 之间停止最后一个 |?我会投票给第一个场景并使用{([^{}|]*)\|([^{}]*)}
    • 我考虑过这种情况。猜猜你会用keyvalue 来表示一对。然而,我认为大括号内的任何内容都需要返回,即使它有多个|
    • 我明白了,我刚刚编辑了上面的评论,在模式中添加了 两个 组来解释我在做什么。
    【解决方案2】:

    你可以使用

    (?<={)[^}]*\|[^}]*(?=})
    

    对于给定的字符串,两个匹配项由尖字符表示:

    ({max_w} * {max_h} * {key|value}) / {key_1|value}
                          ^^^^^^^^^      ^^^^^^^^^^^ 
    

    Demo

    (?&lt;={) 是一个积极的后视。可以说,如果知道所有大括号都出现在匹配的、不重叠的对中,则不需要正向前瞻(?=})

    【讨论】:

      【解决方案3】:

      \{(|.*?|)\} 模式有 2 个替换 | 可以省略,因为它左右两边的替换并不真正有用。

      剩下的\{(.*?)}. 可以匹配任何字符,包括管道字符,因此不能确保它在两者之间匹配。

      您可以使用不交叉匹配卷曲或管道字符的模式来匹配其间的单个管道。

      {\K[^{}|]*\|[^{}|]*(?=})
      
      • { 比赛开幕{
      • \K 忘记匹配到现在
      • [^{}|]* 匹配除所列字符以外的任何字符
      • \| 匹配一个| char
      • [^{}|]* 匹配除所列字符以外的任何字符
      • (?=}) 在右侧声明结束 }

      Regex demo | PHP demo

      $str = "({max_w} * {max_h} * {key|value}) / {key_1|value}";
      $pattern = "/{\K[^{}|]*\|[^{}|]*(?=})/";
      preg_match_all($pattern, $str, $matches);
      print_r($matches[0]);
      

      输出

      Array
      (
          [0] => key|value
          [1] => key_1|value
      )
      

      或者使用捕获组:

      {([^{}|]*\|[^{}|]*)}
      

      Regex demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多