【问题标题】:How To Recurse Subpattern? [duplicate]如何递归子模式? [复制]
【发布时间】:2020-07-01 16:58:40
【问题描述】:

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

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

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

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

但是,我只想匹配前三个:仅以“.select”开头/前面的那些。我的想法不是递归 entire 模式,只递归子模式,所以我可以在嵌套括号之前匹配我想要的任何内容。当然,我不能在模式后面放一个lookbehind,因为它不是固定长度的。

有没有办法做到这一点?

【问题讨论】:

    标签: regex pcre


    【解决方案1】:

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

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

    使用[^()]+ 会稍微提高性能:

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

    【讨论】:

    • 您可能希望在回答中包含this link。欢迎来到 SO,今天的新成员。
    • 很好的第一个答案!我没有意识到递归是这样工作的。
    【解决方案2】:

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

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

    Updated RegEx Demo

    这里?1 只会在开始匹配.select 之后递归捕获组#1,即(...) 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2014-09-19
      • 2014-08-30
      • 2015-08-19
      • 2013-10-19
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多