请考虑以下两个字符串:
a (b (c) d) e
f (g (h) i) j
我想递归地匹配括号中的内容。我可以使用以下模式来做到这一点:
\((?>[^()]|(?R))*\)
这将同时匹配(b (c) d)
和(g (h) i)
。
现在,假设仅在字母a
开头的情况下,我想递归匹配括号中的内容。我怎样才能做到这一点?
使用(?<=a\s)\((?>[^()]|(?R))*\)
似乎无效。
答案 0 :(得分:1)
您可以重复创建一个捕获组并重复第一个子模式,而不是重复整个模式:
(?<=a\s)(\((?>[^()]|(?1))*\))
(?<=a\s)
断言左边是一个和一个空格字符(
捕获组1
\(
匹配(
(?>
原子组
[^()]
匹配除(
或)
以外的任何字符(使用[^()]+
使其更有效率)|
或(?1)
递归第一个子模式)*
关闭原子团并重复0次以上\)
匹配)
)
关闭第1组添加捕获组时,我们可以忽略后面的内容,并匹配a
和一个空格字符:
a\s(\((?>[^()]|(?1))*\))
答案 1 :(得分:0)
更新:该解决方案应该可以解决问题
(?:a\s)(\((?>[^()]|(?1))*\))
使用您自己的字符串进行了测试:
a(b(c)d)e = true
f(g(h)i)j =假
a(b(c)d(f)g)e = true
让我知道这是否可行,为什么不可行。