Wie passt der reguläre Ausdruck "(aa) + \ 1" zu "aaaaaa"?

7

Kann jemand den Prozess erklären, dass eine Engine für reguläre Ausdrücke mit (aa)+ gegen aaaaaa übereinstimmt? Ich weiß, es gibt einen Prozess namens Backtracking, wenn Sie + oder * verwenden, aber ich bin mir nicht sicher, wie es in diesem Beispiel funktioniert.

    
bodacydo 24.08.2013, 14:57
quelle

3 Antworten

14

Wenn Sie den Quantifizierer außerhalb der Erfassungsgruppe platzieren, erfasst er nicht die gesamte mit diesem Muster übereinstimmende Zeichenkette mit Quantifizierer. Es entspricht eher der letzten Wiederholung, die mit dem Muster übereinstimmt.

(aa)+ erfasst also nicht aaaa in der Erfassungsgruppe, sondern nur das letzte Paar - aa , so dass es den Rest des Regex-Musters erfüllen kann.

Also, mit (aa)+ stimmt das Muster zuerst überein - aaaa , und dann stimmt die Rückreferenz mit der erfassten Gruppe überein - aa . Somit entspricht der String - aaaaaa . Nicht (aa)+ stimmt nicht mit allen a's überein, weil dann nichts mehr übrig bleibt, um mit übereinzustimmen.

Hier ist die Aufschlüsselung der Regex (aa)+ :

  • (aa)+ stimmt mit den ersten beiden aa in der Zeichenfolge überein. Verbleibende Zeichenfolge - aaaa .
  • Es gibt noch mehr Übereinstimmungen mit (aa)+ , also geht es weiter zum nächsten aa . Verbleibende Zeichenfolge - aa .
  • Wiederum (aa)+ kann mit der verbleibenden Zeichenfolge übereinstimmen. Also stimmt es mit dem nächsten aa überein. Verbleibende Zeichenfolge - "" . Denken Sie daran, dass die Quantifizierer standardmäßig gierig sind. Sie werden so gut wie möglich übereinstimmen.
  • Nun kann (aa)+ nicht mehr übereinstimmen.
  • Als nächstes im Muster ist . Aber es gibt nichts mehr zu tun.
  • Verfolgen Sie das letzte Muster, das mit (aa)+ übereinstimmt. Verbleibende Zeichenfolge - "aa" .
  • Jetzt versucht erneut zu suchen, und stimmt mit aa überein, da dies momentan in der 1 st Erfassungsgruppe ist.

Referenzen:

Rohit Jain 24.08.2013, 14:59
quelle
4

Der + Quantor bedeutet "1 oder mehr". Die bezieht sich auf die erfasste Gruppe, auf die sich der Quantifizierer bezieht. So effektiv, es sagt "Gruppe aa, 1 oder mehrmals, und dann noch einmal". Das ist das gleiche wie "2 oder mehr Male".

Die Regex könnte also klarer sein als: /(aa){2,}/

Da aaaaaa drei Sätze der Gruppe aa ist, stimmt die Regex mit der Zeichenfolge überein.

    
Niet the Dark Absol 24.08.2013 14:58
quelle
4

Szenario:

%Vor%

Sie können dieses Verhalten mit einem Possessiv-Quantor (++) überprüfen, der Backtracks verbietet:

%Vor%     
Casimir et Hippolyte 24.08.2013 15:07
quelle

Tags und Links