如何递归子模式?

How To Recurse Subpattern?

我正在使用 (\((?>[^()]|(?R))*\)) 来匹配嵌套的括号,它匹配以下所有情况:

.select( foo(bar()) )
.select( foo() )
.select()

.asdf( foo(bar()) )
.asdf( foo() )
.asdf()

https://regex101.com/r/BSy6Zd/1

但是,我只想匹配前三个:只有那些以“.select”开头的with/preceded。我的想法不是递归 entire 模式,而是只递归子模式,这样我就可以在嵌套括号之前匹配我想要的任何内容。当然,我不能在模式后进行回顾,因为它不是固定长度的。

有没有办法做到这一点?

您可以使用这个递归正则表达式:

~\.select \h* ( \( (?> [^()]++ | (?1) )* \) )~x

Updated RegEx Demo

此处?1只会递归捕获组#1,即开始时匹配.select后的(...)部分。

您可以在括号外添加一个捕获,然后使用 (?1) 指示对您刚刚创建的第一个捕获的递归,如下所示:

\.select(\((?>[^()]|(?1))*\))
        ^-------------------^
          new capture group

使用 [^()]+:

性能略有提高
\.select(\((?>[^()]+|(?1))*\))
                   ^