Java转义转义序列

时间:2012-12-12 00:19:52

标签: java regex escaping

我想在字符串中转义转义序列。

示例:如果我有一个内容为“\ n \ u0073”的字符串,我需要以这样的方式转义它们:如果我将它打印到命令行,我会看到

this:
\n\u0073
instead of:

s

我还将转义双引号(“)和反斜杠(\),我想出了一个表达式来逃避那些:

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

这让我产生了:

\"
s\\
但是,它并没有处理转义序列。我想要的是:

\"\n\u0073\\

我需要做哪些修改来逃避转义序列?

3 个答案:

答案 0 :(得分:3)

您可以使用StringEscapeUtils。它上面有方法escapeJava()。不幸的是,imo,没有办法逃脱像 \ u0073 这样的unicode文字,所以对于你的例子输入“\”\ n \ u0073 \“”StringEscapeUtils.escapeJava("\"\n\u0073\"")将返回\"\ns\"

答案 1 :(得分: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

答案 2 :(得分: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。因此,您必须小心在字符串上调用方法,您确定要在“转义符号”中打印每个字符。

相关问题