以给定模式开头时的递归匹配

时间:2019-12-02 10:44:32

标签: regex recursion

请考虑以下两个字符串:

a (b (c) d) e
f (g (h) i) j

我想递归地匹配括号中的内容。我可以使用以下模式来做到这一点:

\((?>[^()]|(?R))*\)

这将同时匹配(b (c) d)(g (h) i)

现在,假设仅在字母a开头的情况下,我想递归匹配括号中的内容。我怎样才能做到这一点?

使用(?<=a\s)\((?>[^()]|(?R))*\)似乎无效。

2 个答案:

答案 0 :(得分:1)

您可以重复创建一个捕获组并重复第一个子模式,而不是重复整个模式:

(?<=a\s)(\((?>[^()]|(?1))*\))
  • (?<=a\s)断言左边是一个和一个空格字符
  • (捕获组1
    • \(匹配(
    • (?>原子组
      • [^()]匹配除()以外的任何字符(使用[^()]+使其更有效率)
      • |
      • (?1)递归第一个子模式
    • )*关闭原子团并重复0次以上
    • \)匹配)
  • )关闭第1组

Regex demo

添加捕获组时,我们可以忽略后面的内容,并匹配a和一个空格字符:

a\s(\((?>[^()]|(?1))*\))

Regex demo

答案 1 :(得分:0)

更新:该解决方案应该可以解决问题

(?:a\s)(\((?>[^()]|(?1))*\))

使用您自己的字符串进行了测试:

a(b(c)d)e = true

f(g(h)i)j =假

a(b(c)d(f)g)e = true

让我知道这是否可行,为什么不可行。