viernes, 9 de abril de 2010

Seleccionar un parte especifica de un String en Java con Scanner

Hola:

Muchas veses cuando desarrollamos sistemas nos topamos con problemitos como el siguiente:

Queremos extraer los caracteres o fracmentos en rojo de un String como este:
2o. Marzo-Abril

Seria una buena idea hacerlo con StringTokenizer pero tambien hay otra manera sensilla y elegante para hacerlo, solo tenemos que saber algo de expresiones, por ejemplo

para el caracter 2 bien podria ser un 3,4,5,6... por lo tanto la expresion para esta seria que siempre este caracter es un digito \d esta es la expresion para un digito

Marzo y Abril bien podrian ser Enero y Febrero, por lo tanto sabremos que siempre con palabras, me refiero que puede ser [a-z] y [A-Z], aqui se puede ocupar mas de una expresion pero para este ejemplo ocuparemos \w

Por lo tanto nuestra expresion completa seria esta:

String input = "2o. Marzo-Abril";
String expr="(\\d)o.\\s(\\w+)-(\\w+)";

Los parentesis son porque queremos obtener tres grupos que cumplan con la expresion que esta dentro de ellos.

String input = "2o. Marzo-Abril";
String expr="(\\d)o.\\s(\\w+)-(\\w+)";


Scanner s = new Scanner(input);
s.findInLine(expr);
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(i+" "+result.group(i));
s.close();

El resultado seria este:

1 2
2 Marzo
3 Abril


Pero que pasaria si el input fuera este:

String input = "40o. Marzo-Abril";

1 0
2 Marzo
3 Abril

en el grupo 1 obtenemos el 0 pero nosotros esperariamos un 40, pero es logico
puesto que nuestre expresion solo es \d que espera solo una posicion de un digito, para que sean varios necesitariamos \d+

String input = "40o. Marzo-Abril";
String expr="(\\d+)o.\\s(\\w+)-(\\w+)";


Scanner s = new Scanner(input);
s.findInLine(expr);
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(i+" "+result.group(i));
s.close();


Resultados:
1 40
2 Marzo
3 Abril

Saludos.



No hay comentarios.: