我们遇到了这个正则表达式的一些问题。
/\(\((((?>[^\(\(\)\)]+)|(?R))*)\)\)/x
它用于“旋转”文本。当我们有“(((((((((((((((((((((((((((((((((((((((((((((((由于句子末尾有三个括号(因为末尾最后三个括号中的第一个属于文本本身)。
它是如何工作的:如果正则表达式在开头有3个或更多,则需要获得前2个括号,在结尾有3个或更多括号时结束最后2个括号。这可能吗???
请记住,它现在在多级别上工作得很好,所以“((((衬衫|毛衣))))”之类的效果很好(最后看到4个括号?)。因此,只有属于文本的括号,才会在起始括号后面开始旋转,或者在结束括号之前结束。
答案 0 :(得分:1)
首先,你不需要转义字符类中的括号,并且在字符类中多次放置相同的字符就没有用了;因此你的正则表达式可以在没有任何功能变化的情况下变成这样:
\(\((((?>[^()]+)|(?R))*)\)\)
我不完全确定你为什么要使用原子团;我可能是错的(如果我是的话,请纠正我),但我发现与使用标准的非捕获组没有任何区别。
这就是说,你现在可以通过在正则表达式的内部捕获中包含另一种可能性来允许正则表达式中的嵌套单括号字符串:
\(\(((?:[^()]|((?R))|(\((?:[^()]|(?3))*\)))*)\)\)
1 2 3
捕获组:
1 - 获得最外层(( ... ))
之间的第一场大比赛
2 - 获取内部匹配和更多嵌套(( ... ))
3 - 获取单个parens之间的内容,以便在该组中也允许递归。如果你不需要它,只需在数组中忽略它,它只是允许嵌套的单个parens。