Java转义字符转义序列

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
如果你的代码中有字符串字面值"\n\u0073", 那就太晚了,因为在运行时没有转义序列。在运行时,该字符串是一个换行符后跟着一个小写s字符。 - Matt Ball
你需要手动映射它们。当Java看到'\u0010'字符时,它并不知道你想要一个"\n" - Bergi
3个回答

3

您可以使用StringEscapeUtils。它有一个名为escapeJava()的方法。不幸的是,我认为没有办法转义Unicode字面量,例如\u0073,因此对于您的示例输入"\"\n\u0073\""StringEscapeUtils.escapeJava("\"\n\u0073\"")将返回\"\ns\"


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

0
这样怎么样?它百分之百有效...唯一的弱点是我为每个所需字符都有一个明确的情况。我不确定是否有办法解决这个问题,但也许你可以通过为整个字符范围创建一个情况来解决这个问题。我不认为正则表达式可以匹配像\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。因此,您必须小心,在您确定要在“转义符号”中打印每个字符的字符串上调用该方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接