Eine teilweise Übereinstimmung ändert die Position des Matcher

9

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.

%Vor%     
Cutter 17.06.2017, 10:38
quelle

2 Antworten

1

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

vornimmt

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)

    
Joop Eggen 18.06.2017, 18:46
quelle
1

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:

%Vor%

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%.

FIX

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.

%Vor%

Wenn wir es von der gleichen find -Methode wie oben gezeigt aufrufen, erhalten wir folgende Ausgabe:

%Vor%

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.

anubhava 19.06.2017 11:02
quelle

Tags und Links