2011-12-15 37 views
56

tengo cadenas A função, Ãugent en el que tengo que sustituir personaje como ç, ã, Ã con cadenas vacías.Reemplazar caracteres no ASCII de la cadena

¿Cómo puedo hacer coincidir solo aquellos caracteres que no sean ASCII?

estoy usando una función

public static String matchAndReplaceNonEnglishChar(String tmpsrcdta) 
    { 
     String newsrcdta = null; 
     char array[] = Arrays.stringToCharArray(tmpsrcdta); 
     if (array == null) 
      return newsrcdta; 

     for (int i = 0; i < array.length; i++) 
     {   
      int nVal = (int)array[i]; 
      boolean bISO = Character.isISOControl(array[i]); // Is character ISO control 
      boolean bIgnorable = Character.isIdentifierIgnorable(array[i]); // Is Ignorable identifier 
      // Remove tab and other unwanted characters.. 
      if (nVal == 9 || bISO || bIgnorable) 
       array[i] = ' '; 
      else if (nVal > 255) 
       array[i] = ' '; 
     } 
     newsrcdta = Arrays.charArrayToString(array); 

     return newsrcdta; 
    } 

pero no está funcionando mejora properly..what se necesita ... aquí tengo otro problema es que la cadena final se está reemplazado por carácter de espacio que crean el espacio extra en la cuerda.

+2

reemplazar con what ?????? –

+0

Posible duplicado de [Forma más rápida de quitar todos los caracteres no imprimibles de una cadena Java] (http://stackoverflow.com/questions/7161534/fastest-way-to-strip-all-non-printable-characters-from- a-java-string) – Stewart

Respuesta

121

Esto buscar y reemplazar todos los no ASCII letras:

String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", ""); 
+0

gracias por la respuesta ... pero esta "A" aún no puede reemplazarse con una cadena vacía. – rahulsri

+2

@rahulsri A es un personaje ASCII perfectamente válido. ¿Por qué debería ser reemplazado? – FailedDev

+0

@Dev, creo que no está visible, pero este es un carácter latino cuyo valor Unicode es "\ u00c3". – rahulsri

19

Esta sería la solución Unicode

String s = "A função, Ãugent"; 
String r = s.replaceAll("\\P{InBasic_Latin}", ""); 

\p{InBasic_Latin} es el bloque de Unicode que contiene todas las letras en el rango Unicode U + 0000..U + 007F (vea regular-expression.info)

\P{InBasic_Latin} es el negado \p{InBasic_Latin}

+5

(Nota para cualquiera confundido como yo: la mayúscula \ P es negation.) – ShreevatsaR

+1

Esto no funciona. – user1187719

+2

@ user1187719, podría ser más preciso, que "Esto no funciona". Esta respuesta ya recibió algunos upvotes, por lo que no puede ser completamente inútil.Por supuesto, si usted tiene una versión de Java antes [Java 7] (http://docs.oracle.com/javase/tutorial/essential/regex/unicode.html), que estoy de acuerdo. Unicode en regex no funciona allí. – stema

2

Puede intentar algo como esto. El rango de Caracteres especiales para alfabetos comienza desde 192, por lo que puede evitar tales caracteres en el resultado.

String name = "A função"; 

StringBuilder result = new StringBuilder(); 
for(char val : name.toCharArray()) { 
    if(val < 192) result.append(val); 
} 
System.out.println("Result "+result.toString()); 
+0

¿Por qué se compara con 192 y no con 128 (cuál sería la tabla ASCII)? Estás asumiendo cierta codificación (creo que ISO-8859-1), pero ¿qué ocurre si la codificación es ISO-8859-2/3/4/5/7 ...? Hay letras en esa área de la mesa. – stema

+0

Sí, depende de la cantidad de caracteres que queremos permitir, así como de la codificación. Este es solo el ejemplo. Podemos agregar condiciones basadas en los caracteres requeridos y la codificación. – mmodi

61

La respuesta de FailedDev es buena, pero se puede mejorar. Si desea conservar los equivalentes ASCII, es necesario normalizar la primera:

String subjectString = "öäü"; 
subjectString = Normalizer.normalize(subjectString, Normalizer.Form.NFD); 
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", ""); 

=> will produce "oau" 

De esa manera, personajes como "la OUA" se va a proyectar "la OUA", que conserva al menos alguna información. Sin normalización, la cadena resultante estará en blanco.

+3

Su respuesta es buena, pero se puede mejorar. Eliminar el uso de Regex en su código y reemplazarlo por un bucle for es increíblemente más rápido (20-40x). Más aquí: http://stackoverflow.com/a/15191508/2511884 – Saket

+0

Gracias por la pista. El alcance de la diferencia en el rendimiento fue inesperado. –

+0

Gracias, muy buen ejemplo –

0

O puede utilizar la función siguiente para eliminar un carácter que no sea ascii de la cadena. Conocerá el trabajo interno.

private static String removeNonASCIIChar(String str) { 

     StringBuffer buff = new StringBuffer(); 
     char chars[] = str.toCharArray(); 

     for (int i = 0; i < chars.length; i++) { 

      if (0 < chars[i] && chars[i] < 127) { 

       buff.append(chars[i]); 
      } 

     } 
     return buff.toString(); 

    } 
Cuestiones relacionadas