2010-03-26 15 views
9

Ist es möglich zu wissen, ob ein Stream/String eine Eingabe enthält, die mit einem regulären Ausdruck übereinstimmen könnte.Kann java.util.regex.Pattern teilweise Übereinstimmungen machen?

Zum Beispiel

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

oder

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

Dank

+1

Das ist nicht wirklich, wie Regex funktioniert. Das Muster sollte eine Teilzeichenfolge der Eingabe sein oder es gibt keine Übereinstimmung. Du könntest dein eigenes Ding schreiben, das dasselbe tut, aber es wäre wie ein umgekehrter Regex. Wenn Sie Ihre 'Eingabe' und 'Muster' Zeichenfolgen umkehren, dann rufen Sie Matcher.Matches (Eingabe) - Sie bekommen, was Sie wollen. – Kylar

Antwort

11

Ja, Java eine Möglichkeit, das zu tun gibt. Zuerst müssen Sie eine der Standardmethoden aufrufen, um die Regex anzuwenden, wie matches() oder find(). Wenn das false zurückgibt, können Sie die hitEnd() Methode verwenden, um herauszufinden, ob einige längere Zeichenfolge angepasst haben könnte:

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

Ausgang:

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

Hat Matcher.matches() nicht tun, was Sie wollen?

+0

Er will das Gegenteil. Sein Muster ist die längere Saite, er möchte aus den Eingabekombinationen * soweit * herausfinden. – jwismar

-1

Wenn Sie wollen einfach nur überprüfen, ob ein String einige Muster durch einen regulären Ausdruck angegeben enthält:

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

Eigentlich sind Sie im Glück: Javas Regex hat die Verfahren Sie wollen:

public boolean hitEnd()

Gibt true zurück, wenn die en d der Eingabe wurde von der Suchmaschine in der letzten von diesem Matcher durchgeführten Übereinstimmungsoperation getroffen.

Wenn diese Methode wahr zurückgibt, ist es möglich, dass mehr Eingaben das Ergebnis der letzten Suche geändert haben.

So in Ihrem Fall:

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

Eine Alternative zu hitEnd ist die Anforderung in der RE selbst angeben.

// 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(); 
Verwandte Themen