0

テキストのブロックから実際の改行を削除し、それらを文字列「\n」に置き換えることになっているコードを書いています。次に、文字列を別のときに読み取るときに、改行を置き換える必要があります(つまり、すべての「\ n」を検索して挿入し\nます。ただし、最初の変換は正常に機能しますが、後者は実行されません。 2番目の置換は何もしていませんがなぜですか?

置換:

theString.replaceAll(Constants.LINE_BREAK, Constants.LINE_BREAK_DB_REPLACEMENT);

再交換:

theString.replaceAll(Constants.LINE_BREAK_DB_REPLACEMENT, Constants.LINE_BREAK);

定数:

public static final String LINE_BREAK = "\n";
public static final String LINE_BREAK_DB_REPLACEMENT = "\\\\n";
4

2 に答える 2

1

最後のreplaceAll()メソッド呼び出しで4つの円記号は必要ありません。これは私にとってはうまくいくようです

    String str = "abc\nefg\nhijklm";

    String newStr = str.replaceAll("\n", "\\\\n");

    String newnewStr = newStr.replaceAll("\\\\n", "\n");

出力は次のとおりです。

abc
efg
hijklm
abc \ nefg \ nhijklm
abc
efg
hijklm

私はあなたが期待したものだと思います。

于 2012-11-06T20:54:32.690 に答える
1

ではString.replaceAll(regex, replacement)、正規表現文字列と置換文字列の両方で、バックスラッシュがエスケープ文字として扱われます。

  • regex正規表現を表し、バックスラッシュを次のようにエスケープします。\\
  • replacementは置換文字列であり、バックスラッシュもエスケープします。

置換文字列の円記号(\)とドル記号($)により、文字列の置換文字列として扱われていた場合とは結果が異なる場合があることに注意してください。Matcher.replaceAllを参照してください。

これは、両方のパラメーターで円記号をエスケープする必要があることを意味します。さらに、文字列定数はエスケープ文字としてバックスラッシュも使用するため、メソッドに渡される文字列定数のバックスラッシュはダブルエスケープする必要があります(この質問も参照してください)。

これは私にとってはうまくいきます:

// Replace newline with "\n"
theString.replaceAll("\\n", "\\\\n");

// Replace "\n" with newline
theString.replaceAll("\\\\n","\n");

Matcher.quoteReplacement()このメソッドを使用して、置換文字列をリテラルとして扱うこともできます。

// Replace newline with "\n"
theString.replaceAll("\\n", Matcher.quoteReplacement("\\n"));
// Replace "\n" with newline
theString.replaceAll("\\\\n",Matcher.quoteReplacement("\n"));
于 2012-11-06T21:08:01.250 に答える