Regex 旋转正则表达式有一个小错误

Regex 旋转正则表达式有一个小错误,regex,parentheses,Regex,Parentheses,我们在使用这个正则表达式时遇到了一些问题 /\(\((((?>[^\(\(\)\)]+)|(?R))*)\)\)/x 它用于“旋转”文本。当我们有一句话像“((我们((爱))这件衬衫(xl号))”,那么他就不能执行这项权利。因为句子末尾的三个括号(因为最后三个括号中的第一个属于文本本身) 工作原理:如果正则表达式的开头有3个或3个以上的圆括号,则需要得到前2个圆括号;如果正则表达式的结尾有3个或3个以上的圆括号,则需要结束后2个圆括号。有可能吗 请记住,它现在在多级上非常有效,因此类似“

我们在使用这个正则表达式时遇到了一些问题

/\(\((((?>[^\(\(\)\)]+)|(?R))*)\)\)/x
它用于“旋转”文本。当我们有一句话像“((我们((爱))这件衬衫(xl号))”,那么他就不能执行这项权利。因为句子末尾的三个括号(因为最后三个括号中的第一个属于文本本身)

工作原理:如果正则表达式的开头有3个或3个以上的圆括号,则需要得到前2个圆括号;如果正则表达式的结尾有3个或3个以上的圆括号,则需要结束后2个圆括号。有可能吗


请记住,它现在在多级上非常有效,因此类似“((这件((衬衫|毛衣)))”的内容也很有效(请参见末尾的4个括号?)。因此,只有当文本中的括号从开始括号的正后方开始旋转或在结束括号的正前方结束时,才会出错。

首先,您不需要在字符类中转义括号,在字符类中多次放置同一个字符也没有用;因此,您的正则表达式可以变成这样,而不会改变任何功能:

\(\((((?>[^()]+)|(?R))*)\)\)
我也不完全清楚你为什么要用原子团;我可能错了(如果我错了,请纠正我),但我没有发现与使用标准的非捕获组有什么区别

这就是说,您现在可以通过在正则表达式的内部捕获中包含另一种可能性来允许在正则表达式中嵌套单括号字符串:

\(\(((?:[^()]|((?R))|(\((?:[^()]|(?3))*\)))*)\)\)
    1         2      3
捕获组:
1-获取最外层的
(…)

2-获取内部匹配项和任何更多嵌套的
(…)

3-获取单个参数之间的内容,以便在该组中也允许递归。如果您不需要它,只需在数组中忽略它,它只允许嵌套的单个参数


你是我的英雄!最后一个正则表达式(
\(\((((?:[^()])(((?R)))(\(((?:[^()])(?3))*)*)\)
)工作起来就像一个sharm@ErikVandeVen我只是想帮忙^^;我很高兴它对你有用:)