0

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

/\(\((((?>[^\(\(\)\)]+)|(?R))*)\)\)/x

它用于“旋转”文本。当我们有一个像“((We ((love | like)) this shirt(size xl)))”这样的句子时,他就不能执行这个权利。因为句子末尾的三个括号(因为末尾的最后三个括号中的第一个属于文本本身)。

它需要如何工作:如果正则表达式开头有 3 个或更多括号,则它需要获取前 2 个括号,当末尾有 3 个或更多括号时,结束最后 2 个括号。那可能吗???

请记住,它现在在多层次上工作得很好,所以像 "((this((shirt|sweater))))" 这样的东西效果很好(见最后的 4 个括号?)。因此,只有当属于文本的括号在开始括号后面开始旋转或在结束括号之前结束时才会出错。

4

1 回答 1

1

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

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

我也不完全确定您为什么要使用原子组;我可能是错的(如果我错了,请纠正我),但我发现与使用标准非捕获组相比没有任何区别。

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

\(\(((?:[^()]|((?R))|(\((?:[^()]|(?3))*\)))*)\)\)
    1         2      3

捕获组:
1 - 获取最外层之间的第一个大匹配(( ... ))
2 - 获取内部匹配和任何更多嵌套(( ... ))
3 - 获取单个括号之间的内容,以便在该组中也允许递归。如果您不需要它,只需在数组中忽略它,它的存在只是为了允许嵌套的单括号。

正则表达式101演示

于 2013-10-09T17:55:12.930 回答