2012-06-22 15 views
15

Estoy tratando de escribir un método que elimina todos los caracteres no alfabéticos de una Java String[] y luego convertir la cadena en una cadena en minúsculas. He intentado usar expresiones regulares para reemplazar la aparición de todos los caracteres no alfabéticos por "" .Sin embargo, la salida que me estoy haciendo no es capaz de hacerlo. Aquí está el códigoEliminar todos los caracteres no alfabéticos de una matriz de cadenas en Java

static String[] inputValidator(String[] line) { 
     for (int i = 0; i < line.length; i++) { 
         line[i].replaceAll("[^a-zA-Z]", ""); 
         line[i].toLowerCase(); 
     } 
     return line; 
    } 

Sin embargo si intento para suministrar una entrada que tiene no alfabetos (por ejemplo - o .), la salida también se compone de ellos, ya que no se eliminan.

Ejemplo de entrada

A dog is an animal. Animals are not people. 

salida que estoy recibiendo

A 
dog 
is 
an 
animal. 
Animals 
are 
not 
people. 

de salida que se espera

a 
dog 
is 
an 
animal 
animals 
are 
not 
people 
+1

Aquí está una muestra de ejecución para comprobar el método http://ideone.com/XOugF – hytriutucx

Respuesta

29

El problema es los cambios no se están almacenando porque las cadenas son immutable. Cada uno de los method calls está volviendo una nueva String que representa el cambio, con la corriente String se mantiene igual. Solo necesita almacenar el String devuelto en la matriz.

line[i] = line[i].replaceAll("[^a-zA-Z]", ""); 
line[i] = line[i].toLowerCase(); 

Debido a la cada método devuelve un String se pueden encadenar su método llama juntos. Esto realizará la segunda llamada al método sobre el resultado de la primera, permitiéndole hacer ambas acciones en una línea.

line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase(); 
2

No funciona porque las cadenas son inmutables, debe establecer un valor , p.

line[i] = line[i].toLowerCase(); 
+0

Sean, se se perdió la llamada de replace all all. –

+0

Iba a editarlo pero una vez lo envié y existían otras 3 respuestas que decían lo mismo, no veía el punto. –

2

debe reasignar el resultado de toLowerCase() y replaceAll() de nuevo a line[i], ya que Java String es inmutable (su valor interno nunca cambia, y los métodos de String clase devolverá una nueva String objeto en lugar de modificar el objeto String)

5

necesita asignar el resultado de la expresión regular de nuevo a las líneas [i].

for (int i = 0; i < line.length; i++) { 
    line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase(); 
} 
1

un lugar fresco (pero un poco engorroso, si no te gusta casting) forma de hacer lo que quiere hacer es ir a través de toda la cadena, índice por el índice, echando cada resultado de String.charAt (índice) a (byte) y, a continuación, comprobar para ver si ese byte es o bien a) en el rango numérico de caracteres alfabéticos en minúsculas (a = 97 a Z = 122), en cuyo caso fundido de nuevo a char y añadirlo a un String, array o what-have-you, o b) en el rango numérico de caracteres alfabéticos en mayúsculas (A = 65 a Z = 90), en cuyo caso agregue 32 (A + 22 = 65 + 32 = 97 = a) y lanzarlo a char y agregarlo. Si no está en ninguno de esos rangos, simplemente deséchelo.

1

Como ya respondió, simplemente pensar en compartir una forma más en que no fue mencionado aquí>

str = str.replaceAll("\\P{Alnum}", "").toLowerCase(); 
+0

Aunque esto es más amplio que solo las letras latinas que coinciden con el código OPs; eso puede o no ser lo que se necesita. –

Cuestiones relacionadas