2013-10-09 20 views
0

我们遇到了这个正则表达式的一些问题。纺纱正则表达式有一个小错误

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

它用于“旋转”文本。当我们有一句像“((我们((爱的样子))这件衬衫(尺码为xl)))”的句子时,他不能执行这个权利。由于句子末尾有三个括号(因为最后三个括号中的第一个括号属于文本本身)。

它需要如何工作:正则表达式需要得到前2个括号,如果它有3个或更多的开始,结束最后2个,当它有3个或更多的括号。那可能吗??? ((((衬衫|毛衣))))“效果很好(见最后4个圆括号?)。所以只有属于文本中的括号才会出现错误,在旋转OR的起始括号后面开始,在结束括号之前结束。

回答

1

那么首先,你不需要转义字符类中的括号,并且在角色类中多次使用同一个字符没什么用处;因此,您正则表达式可以变成这个样子没有任何功能改变:

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

我不完全知道为什么你正在使用的原子团要么;我可能是错的(如果是的话,请纠正我),但我没有发现与使用标准的非捕获组不同的地方。

这就是说,你现在可以通过在正则表达式的内捕获另一种可能允许在正则表达式嵌套单支架字符串:

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

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

regex101 demo

+0

你是我的英雄!最后一个正则表达式('\(\:\(((?:[^()] |((?R))|(\((?:[^()] |(?3))* \)))*) \)\)'),就像一个沙姆沙! –

+0

@ErikVandeVen我只是想帮助^^;我很高兴它为你工作:) – Jerry