2014-01-09 50 views
2

我有一個包含正常文本和Unicode之間的字符串,例如「abc \ ue415abc」。 我想用\u替換\\u的所有匹配項。我怎樣才能做到這一點? 我用下面的代碼,但它不能正常工作。在java中用 u取代\ u字符串

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 { 
     int cp = Integer.parseInt(m.group(1), 16); 
     m.appendReplacement(buf, ""); 
     buf.appendCodePoint(cp); 
    } catch (NumberFormatException e) { 
    } 
} 
m.appendTail(buf); 
s = buf.toString(); 

請幫忙。提前致謝。

回答

1

您的初始字符串實際上沒有任何雙反斜槓。

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 
+0

編輯:添加更多的正則表達式逃脫。 –

+0

非常好解釋...謝謝很多先生 – Rohan

+0

高興得到援助! –

1

試試這個:

s = s.replace(s.indexOf("\\u"), "\u"); 
1

有一個contains方法和字符串一個replace方法。話雖這麼說

String hello = "hgjgu\udfgyud\\ushddsjn\hsdfds\\ubjn"; 

if(hello.contains("\\u")) 
    hello.replace("\\u","\u"); 

System.out.println(hello); 

它會打印: - hgjgu \ udfgyud \ ushddsjn \ hsdfds \ ubjn

+0

它不工作,hello.replace( 「\\ U」, 「\ U」);給出無效Unicode錯誤 – Rohan

相關問題