2010-03-26 13 views
9

¿Es posible saber si una secuencia/cadena contiene una entrada que podría coincidir con una expresión regular.¿Puede java.util.regex.Pattern hacer coincidencias parciales?

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

+1

Eso no es realmente el trabajo de regex. El patrón debe ser una subcadena de la entrada, o no hay coincidencia. Podría escribir lo suyo que haga lo mismo, pero sería como una expresión reversa inversa. Si invierte sus cadenas de 'entrada' y 'patrón', entonces llame a matcher.matches (entrada) - obtendrá lo que desea. – Kylar

Respuesta

11

Sí, Java proporciona una manera 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 vuelve false, puede utilizar el método hitEnd() para averiguar si alguna cadena más larga podría haber emparejado:

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()); 
} 

de salida:

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

¿Se Matcher.matches() no hacer lo que quiera?

+0

Él quiere lo contrario. Su patrón es la cadena más larga, él quiere descubrir las coincidencias de entrada * hasta ahora *. – jwismar

-1

Si sólo desea comprobar si una cadena contiene un patrón especificado por una expresión regular:

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

En realidad, estás de suerte: expresiones regulares de Java no tiene la método que desea:

public boolean hitEnd()

devuelve verdadero si la linea d 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 entradas hayan cambiado el resultado de la última búsqueda.

Así, en su 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" 
1

Una alternativa a hitEnd es especificar el requisito establecido en el propio 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(); 
Cuestiones relacionadas