0

一部の文字が変更された他のプログラムからメッセージが表示されます:

\n(入力) ->#

(ハッシュ) #->\#

\->\\\\

コードでこれらの変更を元に戻そうとすると、おそらくそれが機能しません

置換文字列にバックスラッシュ () とドル記号 ($) を使用すると、リテラル置換文字列として扱われる場合とは結果が異なる場合があることに注意してください。上記のように、ドル記号はキャプチャされたサブシーケンスへの参照として扱われる場合があり、バックスラッシュは置換文字列内のリテラル文字をエスケープするために使用されます。

これは私のコードです:

public String changeChars(final String message) {

    String changedMessage = message;

    changedMessage = changePattern(changedMessage, "[^\\\\][#]", "\n");
    changedMessage = changePattern(changedMessage, "([^\\\\][\\\\#])", "#");
    changedMessage = changePattern(changedMessage, "[\\\\\\\\\\\\\\\\]", "\\\\");

    return changedMessage;
}

private String changePattern(final String message, String patternString, String replaceString) {
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(message);
    return matcher.replaceAll(replaceString);
}
4

1 に答える 1

1

あなたのエンコーディング方法はこのように機能すると思います。

  1. \すべてをに置き換えます\\\\
  2. #元々として配置されたマーク\#
  3. #これで、最初に配置されたものがすべてその前にあることがわかったので、\それを使用して新しい行\nを。でマークできます#

そのためのコードは次のようなものである可能性があります

data = data.replace("\\", "\\\\\\\\");
data = data.replace("#", "\\#");
data = data.replace("\n", "#");

この操作を元に戻すには、最後から開始する必要があります(最後の置換を形成)

  • 以前に#なかったものをすべて新しいラインマークに置き換えます(2番目の置き換えから始めた場合->後でどのウェアの置き換えかはわかりません)。\\n\###\n
  • その後、安全に置き換えることができます(このように\#して、元の文字列になかった#追加の文字列を取り除き、最後の置き換え手順に煩わされることはありません)。\
  • 最後に、に置き換え\\\\ます\

これが私たちがそれを行う方法です。

//your previous regex [^\\\\][#] describes "any character that is not \ and #
//but since we don't want to include that additional non `\` mark while replacing 
//we should use negative look-behind mechanism "(?<!prefix)"
data = data.replaceAll("(?<!\\\\)#", "\n");

//now since we got rid of additional "#" its time to replace `\#` to `#`
data = data.replace("\\#", "#");

//and lastly `\\\\` to `\`
data = data.replace("\\\\\\\\", "\\");
于 2013-01-01T21:03:05.830 に答える