Regex no funciona en String.matches ()

Tengo este pequeño fragmento de código

String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("[az]")) { System.out.println(s); } } 

Supuesta a imprimir

 dkoe 

¡pero no imprime nada!

Bienvenido al mal llamado método .matches() Java … Intenta y combina TODA la entrada. Lamentablemente, otros idiomas han seguido el mismo ejemplo 🙁

Si quiere ver si la expresión regular coincide con un texto de entrada, use un Pattern , un Matcher y el método .find() del emparejador:

 Pattern p = Pattern.compile("[az]"); Matcher m = p.matcher(inputstring); if (m.find()) // match 

Si lo que quieres es, de hecho, ver si una entrada solo tiene letras minúsculas, puedes usar .matches() , pero necesitas .matches() uno o más caracteres: agrega un + a tu clase de caracteres, como en [az]+ . O use ^[az]+$ y .find() .

[az] coincide con un solo carácter entre a y z. Por lo tanto, si su cadena era simplemente "d" , por ejemplo, entonces habría coincidido y se habría impreso.

Necesita cambiar su expresión regular a [az]+ para que coincida con uno o más caracteres.

La implementación de expresiones regulares de Java intenta hacer coincidir toda la cadena

eso es diferente de las expresiones regulares de perl, que intentan encontrar una parte correspondiente

si quieres encontrar una cadena con solo letras minúsculas, usa el patrón [az]+

si quiere encontrar una cadena que contenga al menos un carácter minúsculo, use el patrón .*[az].*

String.matches devuelve si la cadena completa coincide con la expresión regular, no con cualquier subcadena.

Usado

 String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("[az]+")) { System.out.println(s); } } 

He enfrentado el mismo problema una vez:

 Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$"); 

¡Lo anterior falló!

 Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)"); 

Lo anterior funcionó con el patrón dentro ( y ) .

Su expresión regular [az] no coincide con dkoe ya que solo coincide con cadenas de longitud 1. Use algo como [az]+ .

debe poner al menos una captura () en el patrón para que coincida y corregir un patrón como este:

 String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("(^[az]+$)")) { System.out.println(s); } } 

Puedes hacer que tu patrón sea insensible al hacer esto:

 Pattern p = Pattern.compile("[az]+", Pattern.CASE_INSENSITIVE);