gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:30:53 25 4
gpt4 key购买 nike

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

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

应该匹配这样的字符串,因为所有嵌套的括号都已关闭,而是:

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

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

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

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

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

最佳答案

这种模式有效:

$pattern = '~ \( (?: [^()]+ | (?R) )*+ \) ~x';

括号内的内容简单描述:

“所有不是括号或递归(= 其他括号)”x 0 次或更多次

如果你想捕获括号内的所有子串,你必须将这个模式放在前瞻中以获得所有重叠的结果:

$pattern = '~(?= ( \( (?: [^()]+ | (?1) )*+ \) ) )~x';
preg_match_all($pattern, $subject, $matches);
print_r($matches[1]);

请注意,我添加了一个捕获组并将 (?R) 替换为 (?1):

(?R) -> refers to the whole pattern (You can write (?0) too)
(?1) -> refers to the first capturing group

这个前瞻技巧是什么?

先行(或后行)中的子模式不匹配任何内容,它只是一个断言(测试)。因此,它允许多次检查相同的子字符串。

如果您显示整个模式结果 (print_r($matches[0]);),您将看到所有结果都是空字符串。获取先行内部子模式找到的子字符串的唯一方法是将子模式包含在捕获组中。

注意:递归子模式可以这样改进:

\( [^()]*+ (?: (?R) [^()]* )*+ \)

关于php - 如何编写匹配嵌套括号的递归正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20569306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com