2010-03-26 18 views
9

È possibile sapere se uno stream/stringa contiene un input che potrebbe corrispondere a un'espressione regolare con.java.util.regex.Pattern può eseguire corrispondenze parziali?

Per esempio

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 ? 

Grazie

+1

Non è proprio così il lavoro di regex. Lo schema dovrebbe essere una sottostringa dell'input o non c'è corrispondenza. Potresti scrivere la tua stessa cosa che fa lo stesso, ma sarebbe come una regex inversa. Se invertite le stringhe 'input' e 'pattern', quindi chiamate matcher.matches (input) - otterrete ciò che volete. – Kylar

risposta

11

Sì, Java fornisce un modo per farlo. Per prima cosa devi chiamare uno dei metodi standard per applicare la regex, come matches() o find(). Se questo restituisce false, è possibile utilizzare il metodo hitEnd() per scoprire se qualche stringa più lunga avrebbe potuto trovati:

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

uscita:

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

Vuol Matcher.matches() non fare quello che vuoi?

+0

Vuole il contrario. Il suo modello è la stringa più lunga, vuole scoprire le corrispondenze di input * finora *. – jwismar

-1

Se si desidera solo per controllare se una stringa contiene un certo pattern specificato da un'espressione regolare:

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

In realtà, siete fortunati: regex di Java non ha la metodo che si desidera:

public boolean hitEnd()

Restituisce vero se l'en d di input è stato colpito dal motore di ricerca nell'ultima operazione di match eseguita da questo matcher.

Quando questo metodo restituisce true, è possibile che più input abbiano modificato il risultato dell'ultima ricerca.

Quindi nel tuo 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

Un'alternativa a hitEnd è specificare il requisito nel RE stessa.

// 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(); 
Problemi correlati