2010-10-27 9 views

Respuesta

19

para eliminar todos los caracteres que no son BMP, el siguiente debería funcionar:

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

¿Has probado esto? Debido a que su rango de caracteres incluye el rango sustituto utilizado para construir puntos de código que no sean BMP. – Anon

+2

@Anon: Como señaló en su propia respuesta, las expresiones regulares se evalúan a nivel de puntos de código, no de codeunits, por lo que no se visualizan sustitutos. – axtavt

+0

Sí, esto se ha probado con caracteres que no son BMP. –

3

¿Está buscando caracteres específicos o todos los caracteres fuera del BMP?

En el primer caso, se puede utilizar un StringBuilder para construir una cadena que contiene los puntos de código a partir de los planos superiores, y la expresión regular funcionará como se espera:

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 usted está buscando para eliminar toda no -BMP caracteres de una cadena, entonces me gustaría usar StringBuilder directamente en lugar de expresiones regulares:

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