5

文字列内のエスケープシーケンスをエスケープしたい。

例:内容が「\ n \ u0073」の文字列がある場合、コマンドラインに出力すると次のようにエスケープする必要があります。

this:
\n\u0073
instead of:

s

また、二重引用符( ")と円記号(\)をエスケープし、すでにそれらをエスケープする式を見つけました。

Pattern p = Pattern.compile("([\"\\\\])");
String str = p.matcher("\"\n\u0073\\"").replaceAll("\\\\$1");

これは私を生み出します:

\"
s\\

ただし、エスケープシーケンスは処理されません。私が欲しいのは:

\"\n\u0073\\

エスケープシーケンスをエスケープするには、どのような変更を加える必要がありますか?

4

3 に答える 3

3

StringEscapeUtilsを使用できます。その上に方法がありescapeJava()ます。残念ながら、 \u0073のような Unicode リテラルをエスケープする方法はないため、入力例では"\"\n\u0073\""StringEscapeUtils.escapeJava("\"\n\u0073\"")返されます\"\ns\"

于 2012-12-12T00:48:29.403 に答える
1

このようなもの?

public class Example {

    public static void main(String[] argv) {
        System.out.println("= First try =");
        System.out.println("\n\u0073");
        System.out.println("= Second try =");
        System.out.println("\n\\u0073");
    }

}

これは次のように出力されます:

= First try =

s
= Second try =

\u0073
于 2012-12-12T00:55:04.737 に答える
0

このようなものはどうですか?それは100%動作します...唯一の弱点は、必要な各文字に明示的なケースがあることです。それを回避する方法があるかどうかはわかりませんが、文字の全範囲をケースに入れることで回避できるかもしれません。RegExがのような文字定義に一致するとは思い\u0073ませんが、確かにはわかりません。

public static void main(String[] args) {
    String unescaped = "\n\u0073";
    System.out.println("Version 1:\n" + unescaped);
    System.out.println("\nVersion 2:");
    printEscaped(unescaped);
}

public static void printEscaped(String unescaped) {
    for (char c : unescaped.toCharArray()) {
        switch (c) {
            case ('\n'):
                System.out.print("\\n");
                break;
            case ('\u0073'):
                System.out.print("\\u0073");
                break;
            default:
                System.out.print(c);
        }
    }
}

出力:

Version 1:

s

Version 2:
\n\u0073

広く使用するためのもう1つの潜在的な問題は、エスケープシーケンスで定義されていなくても、文字で機能することです。たとえば、printEscaped("s")と同じものを印刷しますprintEscaped("\u0073"):両方とも印刷します\u0073。したがって、すべての文字を「エスケープ表記」で印刷することが確実な文字列に対してのみメソッドを呼び出すように注意する必要があります。

于 2012-12-12T01:09:20.453 に答える