当前位置: 首页 > 面试题库 >

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

倪灿
2023-03-14
问题内容

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

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

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

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

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

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

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

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


问题答案:

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

$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 );


 类似资料:
  • 问题内容: 我正在尝试匹配带有嵌套括号的类似数学表达式的字符串。 [‘((((1 + 0)+1)+1)’] 我希望它与所有包含的表达式匹配,例如(1 + 0),((1 + 0)+1)… 我什至不在乎它是否匹配不需要的表达式,例如(((1 + 0),我可以照顾的。 为什么它还没有这样做,我该怎么做? 问题答案: 正则表达式尝试匹配尽可能多的文本,从而消耗了所有字符串。它不会在字符串的一部分上寻找正则

  • 正如标题所说,以下是一个输入示例: 当然,匹配的字符串将通过递归进行处理。 我希望第一个递归匹配: 之后的过程不用说。。。

  • 我正在寻找一个正则表达式(**),它将匹配未知数量的嵌套函数。所以 所有的比赛都会成功。但举例来说,如果我在末尾添加一个额外的结束括号,它将不会包含在比赛中。 (**)请不要回答通过解析(和计算括号)比使用正则表达式更容易做到这一点——在挠头一会儿后,我已经知道了!

  • 我有这样一个文本: 我试图在c#中使用正则表达式来提取嵌套的if/eles-段。 要查找“?”,我使用了: 模式1: 找到“:”我用了: 模式2:

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 所以我有一个像这样的字符串, 所以我想检查“|”字符并忽略它是否在括号中,就像我在示例中显示的那样。 我添加了这个正则表达式,但它并没有捕获我描述的所有场景。 编辑: 如果我有这样的绳子, 大家好,|早上好[姓名|地址]| 然后,我将字符串按字符断开。但我不想在断开字符串时考虑括号内的字符。