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

时间:2013-04-09 18:50:10

标签: regex groovy

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

这是我的代码。但它只能处理一个案例。不是都。

println name.replaceFirst( /\(.*\)/, '' ) 
println name.replaceAll( /\((.*?)\)/, '' )

另一种解决方案是检测括号匹配是对等还是父对子并使用正确的RegEx。但我不知道如何。

谢谢,

2 个答案:

答案 0 :(得分:2)

你可以做这种事情,因为正则表达式不会削减它

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'

答案 1 :(得分:1)

Groovy使用Java正则表达式,Java正则表达式无法进行常规括号平衡(只有支持递归正则表达式的正则表达式实现才能执行此操作)。你最好写一些简单的代码,循环遍历字符串并匹配括号。

如果您假设最大嵌套级别,则可以强制使用正则表达式解决方案。但是,此解决方案推荐。

  • 没有嵌套:\([^()]*\)
  • Nesting up to 1 level\((?:[^()]*|\([^()]*\))*\)
  • Nesting up to 2 levels\((?:[^()]*|\((?:[^()]*|\([^()]*\))*\))*\)
  • 最多可嵌套n个级别:\((?:[^()]*| + <pattern at level n-1> + )*\)

请注意,在字符串文字中指定正则表达式时,需要转义\