0

ウィキペディアの XML ファイルを読んでいますが、中かっこの間をすべて削除する必要があります。たとえば、次の文字列の場合:

String text = "{{Use dmy date|date=November 2012}} {{Infobox ミュージカル アーティスト <!-- Wikipedia:WikiProject_Musicians を参照 --> | name
= ラス・コンウェイ | 画像 = | キャプション = 1959 年の [[Extended play|EP]] ''More Party Pops'' の前面に描かれているラス コンウェイ。| | 画像サイズ = | 背景 = non_vocal_instrumentalist | birth_name = トレバー・ハーバート・スタンフォード | エイリアス = | 生年月日 = {{生年月日|1925|09|2|df=y}} | 出生地 = [[ブリストル]]、[[イングランド]]、イギリス | Death_date = {{死亡日と年齢|2000|11|16|1925|09|02|df=y}} | Death_place = [[イーストボーン]]、[[サセックス]]、イングランド、イギリス | 起源 = | 楽器 = [[ピアノ]] | ジャンル = | 職業 = [[音楽家]] | year_active = | レーベル = EMI (コロンビア)、Pye、MusicMedia、チャーチル | チャーチル | 関連付けられた行為 = | ウェブサイト = | notable_instruments = }}";

空の文字列に置き換える必要があります。この例には、複数の改行とネストされた {{...}} があることに注意してください。

次のコードを使用しています。

Pattern p1 = Pattern.compile(".*\\({\\{.+\\}\\}).*", Pattern.DOTALL);
Matcher m1 = p1.matcher(text);

while(m1.find()){

String text1 = text.replaceAll(m1.group(1), "");
}

私は正規表現を初めて使用します。何が間違っているのか教えてください。

4

1 に答える 1

1

これは通常、正規表現では不可能です。通常の言語では、ネストの任意のレベルを記述することはできません。これは、どのレベルにあるかを「カウント」する方法がないためです。

絶対に正規表現を使用する必要がある場合は、すべてのネストの可能性を手動でエンコードすることにより、たとえば 3 レベルのネストまで機能する面倒な式を作成できます。しかし、これは非常に面倒であり、事実上 DRY に違反することになり、仕事に適したツールにはほど遠いものです。

必要に応じて、これを「手動で」行う方が簡単でしょう。自分で弦をスキャンし、ヒットするたび{{に「ブレースレベル」を上げます。ヒットするたびに}}減少します。ブレースレベルがゼロの場合にのみ、各文字を出力にコピーします。

(未テスト) のようなもの:

StringBuilder output = new StringBuilder();
char[] input = text.toCharArray();
int braceLevel = 0;
for (int i = 0; i < input.length; i++) {
   final char c = input[i];
   if (c == '{') {
      // Check for {{
      if (i < input.length - 1 && input[i+1] == '{') {
         // Yep, it's a double brace - increase the level, consume
         // the second character and continue with the next char
         braceLevel++;
         i++;
         continue;
      }
   }
   else if (c == '}' && braceLevel > 0) {
      // Check for a closing brace similar to above
      if (i < input.length - 1 && input[i+1] == '}') {
         braceLevel--;
         i++;
         continue;
      }
   }

   if (braceLevel == 0) {
      output.append(c);
   }
}

// Now output contains every character that was not contained within brackets
于 2013-10-03T11:58:48.123 に答える