【问题标题】:Is there a method to omit nested parentheses in regex?有没有一种方法可以在正则表达式中省略嵌套括号?
【发布时间】:2019-07-06 16:23:44
【问题描述】:

我正在为 PHP 的 preg_match_all 编写一个正则表达式函数,以从字符串中查找所有 ifs(...) 及其所有内容。 (在我的示例中,我只有一个 if,因为它不是问题的根源。)

这是我目前所得到的:

模式:/ifs\(.*?\)/i

字符串:=iferror(ifs(OR("foo", "bar"),"a",OR("tar", "scar"),"b",OR("lar"),"d"),"c")

当前输出:ifs(OR("foo", "bar")

预期输出:ifs(OR("foo", "bar"),"a",OR("tar", "scar"),"b",OR("lar"),"d")

问题:正则表达式找到第一个右括号。

我哪里错了?您将如何处理嵌套括号?

演示:https://regex101.com/r/SgBqbW/1

【问题讨论】:

  • 这是不可能通过正则表达式实现的,您需要一些分词器和表达式树来正确解析结束括号;尝试添加您的 regexp101 “不贪婪”标志(U),您会明白
  • 呃哦..确实尝试过,但寄予厚望,也许我错过了一些东西。不幸的是没有......无论如何,谢谢!然后回到我的绘图板上。 x_x
  • 那么 PCRE 实际上能够匹配嵌套的括号,但是现在一旦括号包含在字符串文字中,您的问题就开始了。

标签: php regex nested parentheses


【解决方案1】:

实际上,由于recursive regexps 的 PHP 功能,您可以做到这一点。这是受到该页面上this comment 的启发:

$string = '=iferror(ifs(OR("foo", "bar"),"a",OR("tar", OR("scar", "baa")),"b",OR("lar"),"d"),"c")
blah blah ifs(OR("foo", "bar"),"a") and another one ifs("a", OR("tar", OR("scar", "baa")),"b",OR("lar"),"d")';
$regex = '/ifs(\(((?>[^()]+)|(?-2))*\))/';
preg_match_all($regex, $string, $matches);
print_r($matches[0]);

输出:

Array (
    [0] => ifs(OR("foo", "bar"),"a",OR("tar", OR("scar", "baa")),"b",OR("lar"),"d")
    [1] => ifs(OR("foo", "bar"),"a")
    [2] => ifs("a", OR("tar", OR("scar", "baa")),"b",OR("lar"),"d") 
)

Demo on 3v4l.org

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多