2010-10-27 20 views

回答

19

要刪除所有非BMP字符,下面應該工作:

String sanitizedString = inputString.replaceAll("[^\u0000-\uFFFF]", ""); 
+0

你真的測試過了嗎?因爲您的字符範圍包括用於構建非BMP代碼點的替代範圍。 – Anon 2010-10-27 17:32:12

+2

@Anon:正如你在你自己的答案中指出的那樣,正則表達式是在碼點級而不是碼單元級進行評估的,所以它看不到代理。 – axtavt 2010-10-27 17:35:04

+0

是的,這已經用非BMP字符進行了測試。 – 2010-10-27 17:39:35

3

您是否正在尋找特定字符或BMP以外的所有字符?

如果是前者,你可以使用一個StringBuilder構建從更高層面包含代碼點的字符串,正則表達式將會按預期:

String test = new StringBuilder().append("test").appendCodePoint(0x10300).append("test").toString(); 
    Pattern regex = Pattern.compile(new StringBuilder().appendCodePoint(0x10300).toString()); 

    Matcher matcher = regex.matcher(test); 
    matcher.find(); 
    System.out.println(matcher.start()); 

如果你正在尋找去除所有非從字符串中的字符-BMP,然後我會使用StringBuilder,而不是直接的正則表達式:

StringBuilder sb = new StringBuilder(test.length()); 
    for (int ii = 0 ; ii < test.length() ;) 
    { 
    int codePoint = test.codePointAt(ii); 
    if (codePoint > 0xFFFF) 
    { 
     ii += Character.charCount(codePoint); 
    } 
    else 
    { 
     sb.appendCodePoint(codePoint); 
     ii++; 
    } 
    }