Groovy删除对等关系和父子关系中括号之间的文本



在groovy中,如何删除对等和父子关系中的括号之间的文本?例如,a(b(c)d)返回aa(b)c(d)返回ac ?

这是我的代码。但它只能处理一个案子。不是两个。
println name.replaceFirst( /(.*)/, '' ) 
println name.replaceAll( /((.*?))/, '' )

另一个解决方案是检测括号匹配是对等的还是父对子的,并使用正确的RegEx。但我不知道怎么做。

谢谢,

你可以这样做,因为regex不会剪切它

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正则表达式中没有办法进行一般的括号平衡(只有支持递归正则表达式的正则表达式实现才能做到这一点)。您最好编写一些简单的代码,循环遍历字符串并匹配括号。

如果您假定嵌套的最高级别,则可以强制使用regex解决方案。但是,不建议使用

  • 无嵌套:([^()]*)
  • 嵌套到1级:((?:[^()]*|([^()]*))*)
  • 嵌套多达2级:((?:[^()]*|((?:[^()]*|([^()]*))*))*)
  • 最多n层嵌套:((?:[^()]*| + <pattern at level n-1> + )*)

注意,当您在字符串文本中指定regex时,需要转义

最新更新