php - 如何正确解析递归括号?
问题描述
我需要解析一个包含一些以递归方式处理的括号的字符串,但是我在确定括号的优先级时遇到了麻烦。例如,我有字符串
$truth = "((A^¬B)->C)";
我需要返回括号之间的内容。我已经使用以下正则表达式完成了它:
preg_match_all("~\((.*?)\)~", $truth, $str);
但问题是它返回第一个“(”和第一个“)”之间的内容,即
(A^-B
而不是这个,我需要它“知道”括号正确关闭的位置,以便返回
(A^¬B)->C
关于优先顺序,我怎样才能返回这个?谢谢!
解决方案
对于您的示例 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)
. 如果这可能是您的情况,那么这个答案可能会有所帮助。
推荐阅读
- flutter - Flutter ListView 构建器永远不会完成
- python-telegram-bot - 在 python-telegram-bot 中禁用通知
- flutter - 颤振 - 计算:隔离消息中的非法参数:(对象是一个闭包 - 函数'
':.) - flutter - FormatException:方案不以字母字符开头 - Flutter Http Request
- javascript - 用jquery点击重复的div
- graphql - 在 GraphQL 中,如何选择具有相同特征多次出现的条件的字段
- amazon-redshift - postgresql 错误:类型字符变化的值太长(256)
- r - 如何从r中组的所有值中减去最大值
- byte-buddy - JavaConstant.Dynamic.ofInvocation() 中的类型可分配性是否过于严格?
- sustainsys-saml2 - Sustainsys SAML2 如何检索和 RelayState?