2013-04-09 58 views
1

在groovy中,如何刪除同齡人和父母子女關係中的括號之間的文本?如a(b(c)d)返回a。而a(b)c(d)返回acGroovy在同齡人和父母子女關係中的圓括號之間刪除文本

這是我的代碼。但它只能處理一個案件。不是都。

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

另一種解決方案是檢測括號匹配是對等還是父對子,並使用正確的RegEx。但我不知道如何。

感謝,

回答

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

Groovy使用Java的正則表達式,並且在Java的正則表達式沒有辦法做普通支架平衡(支持遞歸正則表達式可以做到這一點只有regex實現)。你最好寫一些循環遍歷字符串並匹配括號的簡單代碼。

如果您採用最大嵌套級別,則可以強制使用正則表達式解決方案。但是,此解決方案推薦使用而不是

請注意,你需要逃跑\時你在一個字符串中指定正則表達式文字。