8

正規表現を学び始めましたが、正しく理解しているかどうかわかりません。

関数 replaceAll には、置換したい文字列内の文字が置換されないため、問題があります。

これが私のコードです:

public class TestingRegex {
   public static void main (String args[]) {
      String string = "Hel%l&+++o_Wor_++l%d&#";

      char specialCharacters[] = {'%', '%', '&', '_'};

      for (char sc : specialCharacters) {
          if (string.contains(sc + ""))
              string = string.replaceAll(sc + "", "\\" + sc);
      }

      System.out.println("New String: " + string);
   }
}

出力はオリジナルと同じです。何も変わっていません。

出力を : にしたいHel\%l\&+++o\_Wor\_++l\%d\&\#

助けてください。前もって感謝します。

4

1 に答える 1

11

機能しない理由: 単一の「実際の」バックスラッシュを作成するには、Java 文字列に 4 つのバックスラッシュが必要です。

string = string.replaceAll(sc, "\\\\" + sc);

動作するはずです。しかし、これは正しい方法ではありません。forループはまったく必要ありません。

String string = "Hel%l&+++o_Wor_++l%d&#";
string = string.replaceAll("[%&_]", "\\\\$0");

これで完了です。

説明:

  • [%&_]置換する 3 文字のいずれかに一致します
  • $0試合結果なので、
  • "\\\\$0"「バックスラッシュと正規表現によって一致したもの」を意味します。

警告: このソリューションは明らかに、これらの文字のいずれかが以前にエスケープされているかどうかをチェックしていません。そう

Hello\%

になるだろう

Hello\\%

あなたが起こりたくないでしょう。これは問題になる可能性がありますか?

于 2012-07-12T07:34:20.620 に答える