您的初始字符串實際上沒有任何雙反斜槓。
String s = "aaa\\u2022bbb\\u2014ccc";
產生包含aaa\u2022bbb\u2014ccc
,爲\\
只是Java字符串字面轉義\
的字符串。
如果你想Unicode字符:(StackOverflow21028089.java)
import java.util.regex.*;
class StackOverflow21028089 {
public static void main(String[] args) {
String s = "aaa\\u2022bbb\\u2014ccc";
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("\\\\u([0-9A-Fa-f]{4})").matcher(s);
while (m.find()) {
try {
// see example:
// http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#appendReplacement%28java.lang.StringBuffer,%20java.lang.String%29
int cp = Integer.parseInt(m.group(1), 16);
char[] chars = Character.toChars(cp);
String rep = new String(chars);
System.err.printf("Found %d which means '%s'\n", cp, rep);
m.appendReplacement(buf, rep);
} catch (NumberFormatException e) {
System.err.println("Confused: " + e);
}
}
m.appendTail(buf);
s = buf.toString();
System.out.println(s);
}
}
=>
Found 8226 which means '•'
Found 8212 which means '—'
aaa•bbb—ccc
如果你想aaa\u2022bbb\u2014ccc
,這就是你開始用什麼。如果您打算入手一個字符串字面量aaa\\u2022bbb\\u2014ccc
,那就是:
String s = "aaa\\\\u2022bbb\\\\u2014ccc";
並將其轉換爲一個單斜槓可以像@章概述的代碼一樣簡單:
s = s.replaceAll("\\\\u", "\\u");
雖然因爲反斜槓在正則表達式模式和更換(見Matcher's docs)(除了Java的解析)有特殊的意義,這也許應該是:
s = s.replaceAll("\\\\\\\\u", "\\\\u");
=>
aaa\u2022bbb\u2014ccc
編輯:添加更多的正則表達式逃脫。 –
非常好解釋...謝謝很多先生 – Rohan
高興得到援助! –