He siguiente cadena de entrada:
abc.def.ghi.jkl.mno
Número de caracteres de punto puede variar en la entrada. Quiero extraer la palabra después de la última .
(es decir, mno
en el ejemplo anterior). Estoy utilizando el siguiente regex
y su trabajo perfectamente bien:
String input = "abc.def.ghi.jkl.mno";
Pattern pattern = Pattern.compile("([^.]+$)");
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
System.out.println(matcher.group(1));
}
Sin embargo, estoy usando un biblioteca de terceros, que hace juego ( Kafka Conectar para ser exactos) y que sólo puede proporcionar el modelo de expresión regular a la misma. La cuestión es, esta biblioteca (cuyo código no puedo cambiar) utiliza matches()
en lugar de find()
hacer el juego, y cuando ejecuto el mismo código con matches()
, no funciona por ejemplo:
String input = "abc.def.ghi.jkl.mno";
Pattern pattern = Pattern.compile("([^.]+$)");
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
System.out.println(matcher.group(1));
}
El código anterior no se imprime nada. Según el javadoc , matches()
intenta hacer coincidir toda la cadena. ¿Hay alguna manera de aplicar la lógica similar utilizando matches()
para extraer mno
de mi entrada de cadena?
Puedes utilizar
".*\\.([^.]*)"
Concuerda
.*\.
- cualquier 0+ caracteres tantos como sea posible hasta el último.
Char([^.]*)
- Captura de grupo 1: cualquier 0+ caracteres que no sean un punto.
Vea la demostración de expresiones regulares y el gráfico Regulex: