2010-10-27 5 views

risposta

19

Per rimuovere tutti i caratteri non BMP, il seguente dovrebbe funzionare:

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

Avete provato questo? Poiché l'intervallo di caratteri include l'intervallo surrogato utilizzato per creare codici codificati non BMP. – Anon

+2

@Anon: come hai sottolineato nella tua risposta, le espressioni regolari sono valutate al livello dei codepoint, non delle codeunità, quindi non vede surrogati. – axtavt

+0

Sì, questo è stato testato con caratteri non BMP. –

3

Stai cercando caratteri specifici o tutti i caratteri al di fuori del BMP?

Nel primo caso, è possibile utilizzare un StringBuilder per costruire una stringa che contiene punti di codice dai piani superiori, e regex funzionerà come previsto:

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()); 

Se stai cercando di rimuovere tutti i non personaggi -BMP da una stringa, quindi mi piacerebbe utilizzare StringBuilder direttamente, piuttosto che espressione regolare:

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++; 
    } 
    }