Bei Verwendung der Methode Matcher find()
gibt eine teilweise Übereinstimmung false zurück, aber die Position des Matcher wird trotzdem verschoben. Ein nachfolgender Aufruf von find()
lässt diese teilweise übereinstimmenden Zeichen aus.
Beispiel für eine teilweise Übereinstimmung: das Muster "[0-9]+:[0-9]"
gegen die Eingabe "a3;9"
. Dieses Muster stimmt nicht mit irgendeinem Teil der Eingabe überein, daher gibt find()
den Wert false zurück, aber das Untermuster "[0-9]+"
stimmt mit "3"
überein. Wenn wir das Muster an dieser Stelle ändern und find()
erneut aufrufen, werden die Zeichen links neben der Teilübereinstimmung nicht auf eine neue Übereinstimmung getestet.
Beachten Sie, dass das Muster "[0-9]:[0-9]"
(ohne den Quantifizierer) diesen Effekt nicht erzeugt.
Ist das normal?
Beispiel: In der ersten for-Schleife stimmt das dritte Muster [0-9]
mit dem Zeichen "9"
überein und "3"
wird nicht als Übereinstimmung gemeldet. In der zweiten Schleife stimmt das Muster [0-9]
mit dem Zeichen "3"
überein.
Matcher schlägt drei verschiedene Arten von Match-Operationen vor (siehe javadoc)
- matches
für eine gesamte Eingabeübereinstimmung
- find
für ein nicht passendes Traversal-Skipping
- lookingAt
, die eine Teilübereinstimmung vom Start der Sequenz
Wenn ein Muster von lookingAt
gefunden wird, das matcher.region(matcher.end(), matcher.regionEnd())
aufruft, oder ein solches Muster kann für aufeinanderfolgendes Muster verwendet werden.
(Der Großteil des Kredits geht an das OP-Selbst)
Gemäß Javadoc von Matcher#usePattern
:
Diese Methode bewirkt, dass dieser Matcher Informationen über die Gruppen der letzten gefundenen Übereinstimmung verliert. Die Position des Matcher in der Eingabe wird beibehalten und die letzte Position des Anhangs bleibt unverändert.
Gemäß dieser Dokumentation garantiert usePattern
nur, dass Informationen über die Gruppen der letzten Übereinstimmung verloren gehen. Alle anderen Statusinformationen in Matcher
class werden bei dieser Methode nicht zurückgesetzt.
Dies ist der eigentliche Code in usePattern
Methode, der zeigt, dass nur Gruppen initialisiert werden:
Beachten Sie, dass Matcher
class über die privaten Variablen first
und last
verfügt, die nicht mit öffentlichen Methoden verfügbar gemacht werden. Wenn wir reflection
APIs verwenden, können wir sehen, was hier falsch läuft.
Überprüfen Sie diesen Codeblock:
%Vor%Ausgabe:
%Vor% Überprüfen Sie den Unterschied in first/last
-Positionen nach dem Anwenden der Muster "[0-9]+:[0-9]"
und "[0-9]:[0-9]"
. Im ersten Fall wird last
2
, während im zweiten Fall last
bei 1
bleibt. Wenn wir das nächste Mal find()
aufrufen, erhalten wir andere Übereinstimmungen, d. H.% Co_de%.
Da es offensichtlich ist, dass 9 vs 3
matcher
position nicht bei jedem Aufruf von last
zurücksetzt, können wir überladene usePattern
-Methode und liefern die Endposition vom letzten erfolgreichen find(int Start)
-Methodenaufruf.
Wenn wir es von der gleichen find
-Methode wie oben gezeigt aufrufen, erhalten wir folgende Ausgabe:
Obwohl diese Ausgabe immer noch dieselben main
-Positionen wie in der vorherigen Ausgabe anzeigt, findet sie trotz der Verwendung von first/last
method die korrekte Teilzeichenfolge 3
beide Male mit zwei verschiedenen Mustern.
Tags und Links java regex pattern-matching