Duda con patrones en ER

Iniciado por shulneos, 25 Octubre 2013, 20:45 PM

0 Miembros y 1 Visitante están viendo este tema.

shulneos

Hola amigos, estoy diseñando un programa que lee cadenas y devuelve true o false si las acepta o no. La condición para que acepte las cadenas es que contengan una o más palabras concatenadas definidas. Estas son las palabras "TGATCA","TTCGAA","GGCC" Y "GGTACC", (por si a alguien le interesa son cuatro enzimas de ADN).

Bien pues para ello hago uso de la clase Matcher de este modo.

public static void main(String[] args) throws IOException {
//Validacion con Afd.
Afd automata = new Afd("adn.jff");
System.out.println("Introduzca una o varias cadenas separadas"
+ " por coma para su validación: \n");
Scanner consola = new Scanner(System.in);
String linea = consola.nextLine();
String[] listaCadenas = linea.split(",");
System.out.println("********Validación con Afd.********\n");
for (String cadena : listaCadenas) {
System.out.println("La cadena (" + cadena + ") ¿Es válida? "
+ ValidacionADN.esValida(automata, cadena));
if (ValidacionADN.esValida(automata, cadena) == false) {
System.out.println("estado: " + automata.getEstadoActual()
+ ", símbolo: " + automata.getSimboloActual());

}
}
//Validación con Matcher.
System.out.println("********Validacion con Matcher********");


Pattern patEnzimas= Pattern.compile("[[GGCC]*|[GGTACC]*|[TTCGAA]*|[TGATCA]*]+"); // ESTA ES LA LÍNEA QUE TENGO MAL


for (String cadena: listaCadenas){
Matcher matEnzimas= patEnzimas.matcher(cadena);
System.out.println("¿Es válida la cadena ("+cadena+")?"+matEnzimas.matches());
}

}


Mi pregunta es ¿Qué patrón debo pasarle para que me devuelva true si la cadena de entrada es una composición de una o más cadenas descritas anteriormente?




~ Yoya ~

Yo tengo experiencia utilizando regex por alrededor de 4 años, y te recomiendo que dejes de utilizarlas. Yo en lo persona ya no la ocupo, y eso que la amaba con todo mi corazón. Razón??


  • Se dificulta la lectura de código a los integrante de un grupo
  • Se dificulta la corrección de las regex ya existente
  • Da cabida a muchísimos bugs, muchos bugs

El ultimo punto es el mas importante, cuando utilizas regex hay un muy alto porcentaje de tener bugs, y si utilizas muchas regex en un proyecto, al final terminaras cambiando todo el codigo y hacerlo sin utilizar regex.



Utiliza el método contains - http://www.tutorialspoint.com/java/lang/string_contains.htm

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

egyware

Apoyo a Yoya, pero como todas las cosas tiene un pero.
DOCUMENTACIÓN, documentar el código sirve bastante.
Y aunque suene como matar una mosca con un cañón, uno puede utilizar una gramática más alta dentro de la Jerarquía de Chomsky para solucionar los problemas. (buscar Antlr, JavaCC, etc..)

Bueno el problema está en:
Pattern patEnzimas= Pattern.compile("[[GGCC]*|[GGTACC]*|[TTCGAA]*|[TGATCA]*]+");
LO ESTÁS DEFINIENDO MAL!
Al utilizar [] estás definiendo una clase o un grupo. Lo que hace es hacer match a lo que se encuentre definido dentro de los corchetes [] (así los llamamos acá).
en tu caso lo más correcto seria utilizar esto

((GGCC)*|(GGTACC)*|(TGATCA)*)+



Saludos!

~ Yoya ~

Te digo que tengo alrededor de 4 años metido de cabeza con la regex, y al final me he dado cuenta que es mejor no utilizarlas... O si se llegaría a utilizar, que sea con datos estatico, nada dinámico. Y mucha persona igual lo afirman...

Sobre tu regex, esta mala compa porque utiliza el metacaracter * que hace el math si existe cero o mas coincidencia, y por lo tanto no va a pasar del primer math que es GGCC. Puedes hacer la prueba con TGATCA.

Siempre se tendrás que corregir las regex, mientras si utilizas otras formas quizás la tengas que modificar pero no por bugs en el funcionamiento.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

egyware

¡Excelente!

Sabia que algo andaba mal, pero no sabia que era sin embargo como estaba con otro asunto no le realicé las pruebas necesarias.

Al parecer esta expresión (GGCC|GGTACC|TGATCA)+ soluciona tu problema, si no lo soluciona prueba acá primero http://gskinner.com/RegExr/

Bueno tu dices que tienes 4 años metido en la cabeza en Regex, te creo y apoyo tu punto de vista. A mi sin embargo me han ayudado bastante en este ultimo año en cualquier ámbito, aunque siempre trato de mantenerlas lo más simples posibles. (Es más fácil encontrar un bug evidente). Lo que si he trabajado bastante en este ultimo año con gramáticas, y las ER que utilizo son bastante simples en comparación a las tuyas (especulando).

Saludos!

PS: No entiendo porque no funciona... siendo que en mi cabeza compilaba. Aún sí me parece extraño mi primera corrección de la ER.