Angenommen, ich habe eine Zeichenfolge, die Folgendes enthält:
HelloxxxHelloxxxHello
Ich kompiliere ein Muster, um nach 'Hallo' zu suchen.
Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher("HelloxxxHelloxxxHello");
Es sollte drei Übereinstimmungen finden. Wie kann ich zählen, wie viele Spiele es gab?
Ich habe verschiedene Loops ausprobiert und die verwendet, matcher.groupCount()
aber es hat nicht funktioniert.
Antworten:
matcher.find()
findet nicht alle Übereinstimmungen, nur die nächste Übereinstimmung.Lösung für Java 9+
Lösung für Java 8 und älter
Sie müssen Folgendes tun. ( Ab Java 9 gibt es eine schönere Lösung )
Übrigens
matcher.groupCount()
ist etwas ganz anderes.Vollständiges Beispiel :
Umgang mit überlappenden Übereinstimmungen
Wenn Sie Übereinstimmungen
aa
imaaaa
obigen Snippet zählen, erhalten Sie 2 .Um 3 Übereinstimmungen zu erhalten, dh dieses Verhalten:
Sie müssen
<start of last match> + 1
wie folgt nach einer Übereinstimmung im Index suchen :quelle
while(matcher.find()){ matcher.region(matcher.end()-1, str.length()); count++; }
Dies sollte für Übereinstimmungen funktionieren, die sich möglicherweise überschneiden:
quelle
Ab Java 9 können Sie den von bereitgestellten Stream verwenden
Matcher.results()
quelle
Wenn Sie Java 8-Streams verwenden möchten und gegen
while
Schleifen allergisch sind, können Sie Folgendes versuchen:Haftungsausschluss: Dies funktioniert nur bei nicht zusammenhängenden Übereinstimmungen.
Beispiel:
Dies druckt aus:
Dies ist eine Lösung für disjunkte Übereinstimmungen mit Streams:
quelle
Verwenden Sie den folgenden Code, um die Anzahl der Übereinstimmungen zu ermitteln, die der reguläre Ausdruck in Ihrer Eingabe findet
Dies ist jedoch ein verallgemeinerter Code, der nicht spezifisch ist. Passen Sie ihn an Ihre Bedürfnisse an
Bitte zögern Sie nicht, mich zu korrigieren, wenn ein Fehler vorliegt.
quelle