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
. (aa)+
, also geht es weiter zum nächsten aa
. Verbleibende Zeichenfolge - aa
. (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. (aa)+
nicht mehr übereinstimmen.
. Aber es gibt nichts mehr zu tun. (aa)+
übereinstimmt. Verbleibende Zeichenfolge - "aa"
.
erneut zu suchen, und stimmt mit aa
überein, da dies momentan in der 1 st Erfassungsgruppe ist. Referenzen:
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.
Szenario:
%Vor%Sie können dieses Verhalten mit einem Possessiv-Quantor (++) überprüfen, der Backtracks verbietet:
%Vor%Tags und Links regex backtracking