¿Puede java.util.regex.Pattern hacer coincidencias parciales?

¿Es posible saber si un flujo / cadena contiene una entrada que podría coincidir con una expresión regular?

Por ejemplo

String input="AA"; Pattern pat=Pattern.compile("AAAAAB"); Matcher matcher=pat.matcher(input); //<-- something here returning true ? 

o

  String input="BB"; Pattern pat=Pattern.compile("AAAAAB"); Matcher matcher=pat.matcher(input); //<-- something here returning false ? 

Gracias

Sí, Java proporciona una forma de hacerlo. Primero debe llamar a uno de los métodos estándar para aplicar la expresión regular, como matches() o find() . Si eso devuelve false , puede usar el método hitEnd() para averiguar si alguna cadena más larga podría haber coincidido:

 String[] inputs = { "AA", "BB" }; Pattern p = Pattern.compile("AAAAAB"); Matcher m = p.matcher(""); for (String s : inputs) { m.reset(s); System.out.printf("%s -- full match: %B; partial match: %B%n", s, m.matches(), m.hitEnd()); } 

salida:

 AA -- full match: FALSE; partial match: TRUE BB -- full match: FALSE; partial match: FALSE 

En realidad, estás de suerte: la expresión regular de Java tiene el método que deseas:

public boolean hitEnd()

Devuelve verdadero si el final de la entrada fue golpeado por el motor de búsqueda en la última operación de coincidencia realizada por este emparejador.

Cuando este método devuelve verdadero, entonces es posible que más entrada haya cambiado el resultado de la última búsqueda.

Entonces en tu caso:

 String input="AA"; Pattern pat=Pattern.compile("AAB"); Matcher matcher=pat.matcher(input); System.out.println(matcher.matches()); // prints "false" System.out.println(matcher.hitEnd()); // prints "true" 

Una alternativa a hitEnd es especificar el requisito en el RE.

 // Accepts up to 5 'A's or 5 'A's and a 'B' (and anything following) Pattern pat = Pattern.compile("^(?:A{1,5}$|A{5}B)"); boolean yes = pat.matcher("AA").find(); boolean no = pat.matcher("BB").find(); 

¿ Matcher.matches () no hace lo que quieres?

Si solo quieres comprobar si una cadena contiene algún patrón especificado por una expresión regular:

 String s = ...; s.matches( regex )