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()。不幸的是,imo,没有办法转义像\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

另一个更广泛使用的潜在问题是它适用于字符,即使它们不是由转义序列定义的。例如,printEscaped("s")将打印相同的内容printEscaped("\u0073"):它们都将打印\u0073。因此,您必须小心在您确定要以“转义符号”打印每个字符的字符串上调用该方法。

于 2012-12-12T01:09:20.453 回答