1

Groovyでは、ピアと親子関係の括弧の間のテキストを削除する方法は? a(b(c)d)返品などa。そしてa(b)c(d)戻りますacか?

これが私のコードです。ただし、1 つのケースしか処理できません。両方ではありません。

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

別の解決策は、括弧の一致がピアツーピアまたは親から子であるかどうかを検出し、正しい正規表現を使用することです。しかし、方法がわかりません。

ありがとう、

4

2 に答える 2

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'
于 2013-04-09T19:58:31.590 に答える
1

Groovy は Java 正規表現を使用しますが、Java 正規表現では一般的な括弧のバランスを取る方法はありません (再帰的な正規表現をサポートする正規表現の実装のみがこれを行うことができます)。文字列をループして括弧に一致する単純なコードを作成することをお勧めします。

最大レベルのネストを想定している場合は、正規表現ソリューションを強制できます。ただし、このソリューションはお勧めしません

\文字列リテラル内で正規表現を指定する場合は、エスケープする必要があることに注意してください。

于 2013-04-09T19:42:31.383 に答える