Vuelvo con el mismo problema, la solucion planteada arriba funciona pero no en todos los casos, ademas al profe no le gusto como se implemento porque para efectos prácticos no me servira al identificar lexemas, operadores, numeros, etc....
Si me pueden ayudar se los agradesco ahora cambio un poco la jugada:
Se lee de un archivo lo siguiente (nótese los saltos de linea):
Y la salida en pantalla deberá ser la siguiente (incluyendo saltos de linea):
Cita: Esto
es
una
p
ru
eba
ho
la
you
com
si
gnos
87
88
dell
76
Hasta ahora no tengo problema en quitar los simbolos pues lo hago con la solucion de arriba, pero el problema viene cuando tengo que validar numeros que tienen entre sí letras y que no puedo desechar ni el texto ni el numero, en si en la linea: 88dell87 no la puedo separar alguna idea?
les dejo mi código para que vean masomenos como voy (tratando la linea leida):
Código PHP:
//limpio la linea de simbolos no deseados sustituyendo por espacios para separar la linea en palabras despues
linea = linea.trim().replaceAll("[^A-Za-z_0-9]", " ");
//separo la linea por palabras y se almacenan en un arreglo
String [] palabras = linea.split(" ");
//recorro el arreglo de las palabras, para analizar una por una
for(int i=0; i<palabras.length; i++) {
//no me sirven lineas vacías asi que las filtro
if(palabras[i].length() > 0) {
//asigno el valor palabra para manejarlo mas comodamente
String palabra = palabras[i].trim();
//validar la palabra usando el metodo para eso y que me devuelve String
palabra = this.validaPalabra(palabra);
//nuevamente quitar lineas blancas posiblemente generadas
if(palabra.length() > 0) {
//finalmente escribir en pantalla la palabra
System.out.print(palabra);
}
}
}
Este es el método que valida la palabra para que queden palabras que empiecen con letra y puedan tener numeros y guines bajos o que empiecen con numeros y tengan solo numeros:
Código PHP:
//Método que valida la palabra
private String validaPalabra(String palabra) {
//Una variable para almacenar lo que regresaré
String resp = "";
//un contador
int i = 0;
//Identifico el primer caracter de la cadena si es letra entra aqui
if(Character.isLetter(palabra.charAt(i))) {
//como la primer caracter es letra por fuerza entra al while puesto que el valor de "i" no ha cambiado
while(i < palabra.length() && (Character.isLetterOrDigit(palabra.charAt(i)) || Character.toString(palabra.charAt(i)).equals("_"))) {
//si coincide con que es letra, numero o un guion bajo es valido y concatena
resp += palabra.charAt(i);
//e incremento el contador
i++;
}
}
//Identifico el primer caracter de la cadena si es número entra aqui
else if(Character.isDigit(palabra.charAt(i))) {
//como el primer caracter es numero entrará al while porque el valor de i no ha cambiado aún
while(i < palabra.length() && Character.isDigit(palabra.charAt(i))) {
//si el caracter en posicion i es numero concatena....pero y si se encuentra una letra entre los numeros? ejem 23rex32
resp += palabra.charAt(i);
i++;
}
//el programa saldrá del while al encontrar una letra despues de un numero y ahora tengo que leer la cadena con letra
//y la de los numeros y retornar ambas con un salto de linea, pero no se ni como hacerlo?
}
//regreso la palabra validada, mas que nada regreso las que inician con letra porque los numeros con letras enmedio no se validan puesto que no se como
return resp;
}
Más que nada mi problema es de lógica y pues no se como hacerle, alguna sugerencia por favor?
Ha y claro hasta ahora con ese codigo que tengo la salida es la siguiente:
Cita: Esto
es
una
p
ru
eba
ho
la
you
com
si
87
88
Si se fijan me faltan
gnos,
dell y
72
PD: Cabe aclarar que debe ser capaz de leer cualquier archivo no especificamente esas lineas, osea si se encuentra mas simbolos en otro orden pegados separados debe de filtrar el contenido. De antemano muchas gracias por su ayuda.
Saludos!