在groovy中,如何删除对等和父子关系中括号之间的文本?比如a(b(c)d)
退货a
。并a(b)c(d)
返回ac
?
这是我的代码。但它只能处理一种情况。不是都。
println name.replaceFirst( /\(.*\)/, '' )
println name.replaceAll( /\((.*?)\)/, '' )
另一种解决方案是检测括号匹配是对等还是父对子,并使用正确的正则表达式。但我不知道怎么做。
谢谢,
你可以做这种事情,因为正则表达式不会削减它
def strip = { status, ch ->
switch( ch ) {
case '(': status.depth++ ; break
case ')': status.depth-- ; break
default: status.str += (status.depth ? '' : ch)
}
status
}
assert 'a(b(c)d)'.inject( [ str:'', depth:0 ], strip ).str == 'a'
assert 'a(b)c(d)'.inject( [ str:'', depth:0 ], strip ).str == 'ac'
Groovy 使用 Java 正则表达式,Java 正则表达式中没有办法进行一般的括号平衡(只有支持递归正则表达式的正则表达式实现才能做到这一点)。你最好编写一些简单的代码来循环字符串并匹配括号。
如果您假设最大嵌套级别,则可以强制使用正则表达式解决方案。但是,不建议使用此解决方案。
\([^()]*\)
\((?:[^()]*|\([^()]*\))*\)
\((?:[^()]*|\((?:[^()]*|\([^()]*\))*\))*\)
\((?:[^()]*|
++<pattern at level n-1>
)*\)
\
请注意,当您在字符串文字中指定正则表达式时,您需要转义。