首页 > 解决方案 > 如何正确解析递归括号?

问题描述

我需要解析一个包含一些以递归方式处理的括号的字符串,但是我在确定括号的优先级时遇到了麻烦。例如,我有字符串

$truth = "((A^¬B)->C)";

我需要返回括号之间的内容。我已经使用以下正则表达式完成了它:

preg_match_all("~\((.*?)\)~", $truth, $str);

但问题是它返回第一个“(”和第一个“)”之间的内容,即

(A^-B

而不是这个,我需要它“知道”括号正确关闭的位置,以便返回

(A^¬B)->C

关于优先顺序,我怎样才能返回这个?谢谢!

标签: phpregex

解决方案


对于您的示例 string,类似这样的内容将递归地为您提供括号的内容。它通过在正则表达式的每一端使用^[^(]*和强制匹配的括号成为最外层的一对。[^)]*$

$truth = "((A^¬B)->C)";
while (strpos($truth, '(') !== false) {
    preg_match("~^[^(]*\((.*?)\)[^)]*$~", $truth, $str);
    $truth = $str[1];
    echo "$truth\n";
}

输出

(A^¬B)->C 
A^¬B

但是请注意,这不会正确解析字符串,例如(A+B)-(C+D). 如果这可能是您的情况,那么这个答案可能会有所帮助。

3v4l.org 上的演示


推荐阅读