php - 如何正确解析递归括号?

标签 php regex

我需要解析一个包含一些递归处理的括号的字符串,但我无法确定括号的优先级。 例如,我有字符串

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

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

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

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

(A^¬B

取而代之的是,我需要它“知道”括号正确闭合的位置,以便返回

(A^¬B)->C

我怎样才能根据优先顺序返回这个?谢谢!

最佳答案

您现在遇到的主要问题是 ? 非贪婪位。如果您将其更改为只是 .+ greedy 它将匹配您想要的。

$truth = "((A^¬B)->C)";
preg_match('/\(.+\)/', $truth, $match);

Try it

输出

(A^¬B)->C

如果你想匹配内部对,你可以使用递归子模式:

$truth = "((A^¬B)->C)";
preg_match('/\(([^()]+|(?0))\)/', $truth, $match);

Try It online

输出

A^¬B

如果您需要更进一步,那么您可以制作词法分析器/解析器。我这里有一些例子:

https://github.com/ArtisticPhoenix/MISC/tree/master/Lexers

关于php - 如何正确解析递归括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53245032/

相关文章:

PHP 如何预匹配这个字符串?

python - 在 Python 中使用正则表达式匹配 JSON 键

python - 使用字典和 re.compile() 进行搜索

php - 在 PHP 上使用正则表达式获取 HTML 页面 <input> 值和名称

php - Node.js 相当于 PHPlivedocx?

php - 如何安全地移除 Laravel Debugbar

php - MySQL选择变量不在行中的位置

javascript正则表达式忽略chokidar的子目录

php - 将所有符号转换为 html 实体

javascript - 如何去除 javascript 中的所有 html 标签?