En Java más o menos todos conocemos las expresiones regulares. Con ellas podemos comprobar si una cadena de caracteres cumple un determinado patrón. Por ejemplo, para ver si una cadena corresponde a una fecha "dd/mm/yy", podemos usar la expresión regular "\\d{1,2}/\\d{1,2}/\\d{1,2}". Luego, la clase Pattern nos dice si la cadena cumple o no con el patrón. Por ejemplo
Pattern.matches("\\d{1,2}/\\d{1,2}/\\d{1,2}", "11/22/33") // devuelve true
Pattern.matches("\\d{1,2}/\\d{1,2}/\\d{1,2}", "a/22/cc") // devuelve false
Lo que quizás es menos conocido, es que podemos "extraer" de las cadenas que estamos verificando aquellas partes que nos interesen. Por ejemplo, una vez verificado que la cadena es una fecha, podemos querer extraer el día, el mes y el año.
Con expresiones regulares podemos hacer esta tarea algo más sencilla, sin necesidad de andar buscando indices y extrayendo subcadenas.
El "truco" consiste en meter entre paréntesis en la expresión regular aquellos trozos en los que tenemos interés. Por ejemplo, para nuestra fecha, podemos poner la expresión regular así "(\\d{1,2})/(\\d{1,2})/(\\d{1,2})". Luego, el siguiente código nos da fácilmente las tres subcadenas correspondientes a los números
// Obtenemos un Pattern con la expresión regular, y de él
// un Matcher, para extraer los trozos de interés.
Pattern patron = Pattern.compile("(\\d{1,2})/(\\d{1,2})/(\\d{1,2})");
Matcher matcher = patron.matcher("11/22/33");// Hace que Matcher busque los trozos.
matcher.find();// Vamos obteniendo los trozos. El primer paréntesis es el 1,
// el segundo el 2 y el tercero el 3
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));// La salida de este programa es
// 11
// 22
// 33