我需要解析一个包含一些递归处理的括号的字符串,但我无法确定括号的优先级。 例如,我有字符串
$truth = "((A^¬B)->C)";
我需要返回括号之间的内容。我已经使用以下正则表达式完成了它:
preg_match_all("~\((.*?)\)~", $truth, $str);
但问题是它返回第一个“(”和第一个“)”之间的内容,即
(A^¬B
取而代之的是,我需要它“知道”括号正确闭合的位置,以便返回
(A^¬B)->C
我怎样才能根据优先顺序返回这个?谢谢!
最佳答案
您现在遇到的主要问题是 ?
非贪婪位。如果您将其更改为只是 .+
greedy 它将匹配您想要的。
$truth = "((A^¬B)->C)";
preg_match('/\(.+\)/', $truth, $match);
输出
(A^¬B)->C
如果你想匹配内部对,你可以使用递归子模式:
$truth = "((A^¬B)->C)";
preg_match('/\(([^()]+|(?0))\)/', $truth, $match);
输出
A^¬B
如果您需要更进一步,那么您可以制作词法分析器/解析器。我这里有一些例子:
关于php - 如何正确解析递归括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53245032/