Java.util.regex.Pattern può eseguire corrispondenze parziali?

È ansible sapere se uno stream / stringa contiene un input che potrebbe corrispondere a un’espressione regolare.

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

Sì, Java offre un modo per farlo. Per prima cosa devi chiamare uno dei metodi standard per applicare la regex, come matches() o find() . Se restituisce false , puoi utilizzare il metodo hitEnd() per scoprire se una stringa più lunga potrebbe avere una corrispondenza:

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

produzione:

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

In realtà, sei fortunato: la regex di Java ha il metodo che vuoi:

public boolean hitEnd()

Restituisce true se la fine dell’input è stata colpita dal motore di ricerca nell’ultima operazione di match eseguita da questo matcher.

Quando questo metodo restituisce true, allora è ansible che più input abbiano cambiato 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" 

Un’alternativa a hitEnd è specificare il requisito nel RE stesso.

 // 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 () non fa quello che vuoi?

Se vuoi solo verificare se una stringa contiene un pattern specificato da un’espressione regolare:

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