一尘不染

如何编写与嵌套括号匹配的递归正则表达式?

php

我正在尝试编写一个匹配嵌套括号的正则表达式,例如:

"(((text(text))))(text()()text)(casual(characters(#$%^^&&#^%#@!&**&#^*!@#^**_)))"

这样的字符串应该匹配,导致所有嵌套括号都被关闭,而是:

"(((text)))(text)(casualChars*#(!&#*(!))"

不应该或更好地至少匹配第一个“(((text)))(text)”部分。

实际上,我的正则表达式是:

 $regex = '/( (  (\() ([^[]*?)  (?R)?  (\))  ){0,}) /x';

但这并不能像我期望的那样正常工作。如何解决?我哪里错了?谢谢!


阅读 440

收藏
2020-05-29

共1个答案

一尘不染

当我找到此答案时,我无法弄清楚如何修改模式以使用自己的定界符where {}。所以我的方法是使其更通用。

这是一个用 您自己的左右定界符变量 生成regex模式的脚本。

$delimiter_wrap  = '~';
$delimiter_left  = '{';/* put YOUR left delimiter here.  */
$delimiter_right = '}';/* put YOUR right delimiter here. */

$delimiter_left  = preg_quote( $delimiter_left,  $delimiter_wrap );
$delimiter_right = preg_quote( $delimiter_right, $delimiter_wrap );
$pattern         = $delimiter_wrap . $delimiter_left
                 . '((?:[^' . $delimiter_left . $delimiter_right . ']++|(?R))*)'
                 . $delimiter_right . $delimiter_wrap;

/* Now you can use the generated pattern. */
preg_match_all( $pattern, $subject, $matches );
2020-05-29