如何递归子模式?
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
此处?1
只会递归捕获组#1,即开始时匹配.select
后的(...)
部分。
您可以在括号外添加一个捕获,然后使用 (?1)
指示对您刚刚创建的第一个捕获的递归,如下所示:
\.select(\((?>[^()]|(?1))*\))
^-------------------^
new capture group
使用 [^()]+
:
性能略有提高
\.select(\((?>[^()]+|(?1))*\))
^
我正在使用 (\((?>[^()]|(?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
此处?1
只会递归捕获组#1,即开始时匹配.select
后的(...)
部分。
您可以在括号外添加一个捕获,然后使用 (?1)
指示对您刚刚创建的第一个捕获的递归,如下所示:
\.select(\((?>[^()]|(?1))*\))
^-------------------^
new capture group
使用 [^()]+
:
\.select(\((?>[^()]+|(?1))*\))
^