2010-10-27 2 views

Répondre

19

Pour supprimer tous les caractères non-BMP, ce qui suit devrait fonctionner:

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

Avez-vous déjà testé cela? Parce que votre gamme de caractères inclut la plage de substitution utilisée pour construire des points de code non-BMP. – Anon

+2

@Anon: Comme vous l'avez souligné dans votre propre réponse, les expressions rationnelles sont évaluées au niveau des points de code, pas des codounits, donc ils ne voient pas de substituts. – axtavt

+0

Oui, cela a été testé avec des caractères non-BMP. –

3

Vous recherchez des caractères spécifiques ou tous les caractères en dehors du BMP?

Si l'ancien, vous pouvez utiliser un StringBuilder pour construire une chaîne contenant les points de code des plans supérieurs, et regex fonctionnera comme prévu:

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

Si vous cherchez à supprimer tous non caractères -bmp d'une chaîne, puis j'utiliser StringBuilder directement plutôt que regex:

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