Foros del Web » Programación para mayores de 30 ;) » Java »

Limpiar una String quitandole caracteres deseados

Estas en el tema de Limpiar una String quitandole caracteres deseados en el foro de Java en Foros del Web. Hola a todos, resulta que necesito hacer un compilador, pero en partes, por ahora en lo que tengo dificultades es en que limpie una String ...
  #1 (permalink)  
Antiguo 14/09/2011, 20:27
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años, 6 meses
Puntos: 69
Limpiar una String quitandole caracteres deseados

Hola a todos, resulta que necesito hacer un compilador, pero en partes, por ahora en lo que tengo dificultades es en que limpie una String quitandole carácteres que no quiero que salgan en pantalla, mas o menos así:

si leo la cadena: "M_var*Dim_3_2-51 otra palabra%extra"

la salida debería ser:
M_var
Dim_3_2
51
otra
palabra
extra

entonces digo:
Código PHP:
//divido la linea por "palabras" y las almaceno en un arreglo vdd
String[] palabras linea.split("\\ ");
        for(
int i=0i<palabras.lengthi++) {
            if(
palabras[i].matches("[A-Za-z_0-9]")) {
                
System.out.println("La palabra contiene caracteres validos" palabras[i]);
            }
            else {
                
System.out.println("Hay caracteres no válidos como  #$%&*+{}<>" palabras[i]);
            }
        } 
Bueno eso es masomenos lo que tengo, el asunto es que corro mi programa, leo un archivo que tiene la misma linea que expuse aqui, y el arreglo de strings me almacena 3 palabras:
1.- M_var*Dim_3_2-51
2.- otra
3.- palabra%extra

pero al correr el programa me dice que las 3 tienen caracteres inválidos, siendo que la numero 2 no los tiene porque tiene solo letras. Estoy usando mal las expresiones regulares? intente colocando solo "w" que segun leí es equivalente a la expresion que trato armar.

Mi duda en sí, es como le hago si voy mal que es lo que debo hacer, que logica me sugieren, que metodos o clases puedo usar, hay alguna que ya lo haga más facil, o cual es mi error porque no me reconoce que la palabra "otra" es válida

Gracias de antemano por su ayuda, cualquier sugerencia es bienvenida, tengo que entregar esto mañana por la tarde asi que agradecería que si pueden o saben una solucion me la faciliten a la brevedad posible.

Gracias nuevamente y que esten bien =)
  #2 (permalink)  
Antiguo 15/09/2011, 01:17
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Limpiar una String quitandole caracteres deseados

El problema es que el programa, tal y como lo tienes, solo hace split en los espacios, y no en la palabra en sí, que es como tú deseas, por eso te imprime 3 palabras.

Prueba a hacer un replaceall sobre cada una de las 3 palabras utilizando la negación de esa regular expression, convirtiéndolos en espacios, repites el split y voila! ahi lo tienes.
  #3 (permalink)  
Antiguo 15/09/2011, 01:24
 
Fecha de Ingreso: diciembre-2010
Mensajes: 459
Antigüedad: 13 años, 11 meses
Puntos: 21
Respuesta: Limpiar una String quitandole caracteres deseados

No estoy seguro pero prueba primero esto:

Código PHP:
Ver original
  1. if(palabras[i].matches("[A-Za-z_0-9]*")) {
  2.                 System.out.println("La palabra contiene caracteres validos" + palabras[i]);
  3.             }
  4.             else {
  5.                 System.out.println("Hay caracteres no válidos como  #$%&*+{}<>" + palabras[i]);
  6.             }

Saludos
  #4 (permalink)  
Antiguo 15/09/2011, 10:29
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años, 6 meses
Puntos: 69
Respuesta: Limpiar una String quitandole caracteres deseados

Gracias por sus respuestas le agregé el asterisco *** a la expresión regular y funcionó como deberia ser =), ahora me falta hacer lo que dice Fuzzylog decirle que si encuentra esos simbolos los remplace con un espacio....aunque remplace el código pues me parecio bien esa lódgica desde un inicio dividir la linea tanto por espacios como por simbolos raros. De modo que vi que el metodo .split() recibe una expresion regular, solo tengo que poner alli una expresion regular que detecte los simbolos raros y los espacios.

Segun leí es asi no? ^[A-Za-z_0-9]*
solo que como agrego el espacio " " a la expresion regular?

Código PHP:
linea "M_var*Dim_3_2-51 otra palabra";
String[] palabras linea.split("^[A-Za-z_0-9]*");
                
        for(
int i=0i<palabras.lengthi++) {
            
System.out.println(palabras[i]);
        } 
Y así como tengo el código la salida es la siguiente:
*Dim_3_2-51 otra palabra

porque no reconoce la expresion regular?, o como se representa la negacion de una expresion regular y como se representa el espacio en blanco en una expresion regular??


*****EDITO******
Me respondo a mi mismo la expresion regular para que la cache debe tener la negacion dentro de los corchetes de manera que queda asi [^A-Za-z_0-9] el metodo queda asi:

Código PHP:
public String limpiarLinea(String linea) {
        
String limpia "";
        
        
String[] palabras linea.split("[^A-Za-z_0-9]");
                
        
int i 0;
        for(
i=0i<palabras.lengthi++) {
            
limpia limpia palabras[i] + " ";
        }
        return 
limpia;
    } 
Y hasta este momento entiendo lo que me decia Fuzzylog pues con el replaceAll se hace exactamente lo mismo, no había necesidad de hacer el metodo.

Código PHP:
String cadenalimpia cadenasucia.replaceAll("[^A-Za-z_0-9]"" "); 
En si el problema esta en que no se armar expresiones regulares, pero bueno ganando experiencia poco a poco.

Gracias a todos por su ayuda =)

Si quieren saber más sobre el tema tambien esta el java identifier les dejo un link
http://www.exampledepot.com/egs/java.lang/IsJavaId.html (si esta prohibido poner links notifcarme y lo borro =))

Última edición por zero0097; 15/09/2011 a las 11:27
  #5 (permalink)  
Antiguo 22/09/2011, 19:41
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años, 6 meses
Puntos: 69
Respuesta: Limpiar una String quitandole caracteres deseados

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):
Cita:
Esto*es #$% una p%ru&eba
ho{}[email protected]
si" _gnos
87.88dell76
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=0i<palabras.lengthi++) {
            
//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(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(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!
  #6 (permalink)  
Antiguo 23/09/2011, 01:46
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Limpiar una String quitandole caracteres deseados

¿Por qué no utilizas el debug para ir viendo paso a paso lo que está haciendo?

Así verías cuando está descartando gnos y por qué.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 23/09/2011, 14:44
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años, 6 meses
Puntos: 69
Respuesta: Limpiar una String quitandole caracteres deseados

Gracias Xerelo por la respuesta yo uso eclipse la verdad no se como hacer eso del debug, buscare un tutorial que lo explique, ya consegui que saliera la palabra "gnos" solo habia que implementar que borrara los guines bajos si la cadena empezaba con ellos.

Pero aun me faltan dell y 72.... en si solo necesito un algoritmo para:
Entrada: 34letras878

Salida:
34
letras
878

la verdad nos e me ocurre como hacerlo, que clases me sirven, alguna idea se los agradezco..
  #8 (permalink)  
Antiguo 23/09/2011, 21:03
 
Fecha de Ingreso: septiembre-2011
Ubicación: Agua Dulce
Mensajes: 8
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Limpiar una String quitandole caracteres deseados

oye amigo no me podrias enviar tu codigo lo que pasa es que yo tengo un problema similar y pues quiero comparar grax
  #9 (permalink)  
Antiguo 24/09/2011, 09:37
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años, 6 meses
Puntos: 69
Respuesta: Limpiar una String quitandole caracteres deseados

Pues aquit esta publicado en mis mensajes el código checalo, esta desde leer la linea que es lo importante, lo demas dudo que te sirva pues son clases que arman la interfaz grafica y manejan los eventos. En sí la logica de separar la linea esta publicada aqui y como leerás pues aun me falta validar ciertas palabras como los numeros que tienen letras.

Etiquetas: caracteres, limpiar, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:03.