我想在字符串中转义转义序列。
示例:如果我有一个内容为“\ n \ u0073”的字符串,我需要以这样的方式转义它们:如果我将它打印到命令行,我会看到
this:
\n\u0073
instead of:
s
我还将转义双引号(“)和反斜杠(\),我想出了一个表达式来逃避那些:
Pattern p = Pattern.compile("([\"\\\\])");
String str = p.matcher("\"\n\u0073\\"").replaceAll("\\\\$1");
这让我产生了:
\"
s\\
但是,它并没有处理转义序列。我想要的是:
\"\n\u0073\\
我需要做哪些修改来逃避转义序列?
答案 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
。因此,您必须小心仅在字符串上调用方法,您确定要在“转义符号”中打印每个字符。