Ich versuche den Unterschied zwischen matches()
und zu verstehen find()
.
Laut Javadoc wird ( matches()
soweit ich weiß ) die gesamte Zeichenfolge durchsucht, auch wenn sie findet, wonach sie sucht, und sie find()
wird aufhören, wenn sie findet, wonach sie sucht.
Wenn diese Annahme richtig ist, kann ich nicht sehen, wann Sie matches()
stattdessen verwenden find()
möchten, es sei denn, Sie möchten die Anzahl der gefundenen Übereinstimmungen zählen.
Meiner Meinung nach sollte die String-Klasse dann find()
statt matches()
als eingebaute Methode haben.
Um es zusammenzufassen:
- Ist meine Annahme richtig?
- Wann ist es sinnvoll,
matches()
statt zu verwendenfind()
?
find()
mehrmaliger Anruf unterschiedliche Ergebnisse für dasselbe Ergebnis liefern kannMatcher
. Siehe meine Antwort unten.Antworten:
matches
versucht, den Ausdruck mit der gesamten Zeichenfolge abzugleichen und implizit ein^
am Anfang und$
am Ende Ihres Musters hinzuzufügen , was bedeutet, dass nicht nach einer Teilzeichenfolge gesucht wird. Daher die Ausgabe dieses Codes:123
ist eine Teilzeichenfolge von,a123b
sodass diefind()
Methode true ausgibt.matches()
nur "sieht",a123b
was nicht dasselbe ist123
und somit false ausgibt.quelle
matchers()
ist nicht einfach einfind()
mit impliziter Umgebung ^ und $. Beachten Sie, dass Aufruf.find()
mehr als einmal unterschiedliche Ergebnisse haben kann , wenn nicht durch vorausgegangenreset()
, währendmatches()
immer gleiches Ergebnis zurück. Siehe meine Antwort unten.matches
Geben Sie true zurück, wenn die gesamte Zeichenfolge mit dem angegebenen Muster übereinstimmt.find
versucht, einen Teilstring zu finden, der dem Muster entspricht.quelle
matches(p)
ist das Gleiche, alsfind("^" + p + "$")
ob das klarer wäre."123abc123".matches("[a-z]+")
wird genauso scheitern wie"123abc123".find("^[a-z]+$")
würde. Mein Punkt war, dass diesmatches()
für ein komplettes Match gilt, genau wiefind()
bei Start- und Endankern.Pattern.compile("some pattern").matcher(str).matches()
ist gleichPattern.compile("^some pattern$").matcher(str).find()
...("some pattern").matcher(str).matches()
ist nicht genau gleich,...("^some pattern$").matcher(str).find()
das gilt nur für den ersten Aufruf. Siehe meine Antwort unten.matches()
gibt nur dann true zurück, wenn die vollständige Zeichenfolge übereinstimmt.find()
wird versuchen, das nächste Vorkommen in der Teilzeichenfolge zu finden, das dem regulären Ausdruck entspricht. Beachten Sie die Betonung auf "das nächste". Das heißt, das Ergebnis einesfind()
mehrmaligen Anrufs ist möglicherweise nicht dasselbe. Darüber hinaus könnenfind()
Sie mithilfe von aufrufenstart()
, um die Position zurückzugeben, an der der Teilstring abgeglichen wurde.Wird ausgegeben:
Seien Sie also vorsichtig, wenn Sie
find()
mehrmals aufrufen, wenn dasMatcher
Objekt nicht zurückgesetzt wurde, auch wenn der reguläre Ausdruck von der vollständigen Zeichenfolge umgeben ist^
und$
mit dieser übereinstimmt.quelle
find()
wird die Unterzeichenfolge gegen den regulären Ausdruck betrachten, wobei asmatches()
den vollständigen Ausdruck berücksichtigt.find()
wird nur dann true zurückgeben, wenn die Unterzeichenfolge des Ausdrucks mit dem Muster übereinstimmt.quelle
matches();
find()
puffert nicht, sondern puffert.find()
Sucht zuerst bis zum Ende der Zeichenfolge, indiziert das Ergebnis und gibt den Booleschen Wert und den entsprechenden Index zurück.Deshalb, wenn Sie einen Code wie haben
Bei 4: Die Regex-Engine, die die Musterstruktur verwendet, liest den gesamten Code durch (Index zu Index, wie durch angegeben
regex[single character]
, um mindestens eine Übereinstimmung zu finden. Wenn eine solche Übereinstimmung gefunden wird, wird sie indiziert, und die Schleife wird basierend auf ausgeführt Das indizierte Ergebnis sonst, wenn es keine Vorausberechnung wie die folgende durchführtmatches()
, funktioniert nicht. Die while-Anweisung würde niemals ausgeführt, da das erste Zeichen der übereinstimmenden Zeichenfolge kein Alphabet ist.quelle