Konnte es mir anhand der
hier anführten Erklärungen selbst (hoffentlich korrekt) erklären: Eine Regex-Engine probiert stumpf schrittweise die einzelnen Bestandteile des regulären Ausdrucks durch. Das bedeutet, bei einem regulären Ausdruck
abc (wobei
a,
b, und
c für einen beliebigen Teilausdruck stehen) probiert die Engine zuerst, ob
a matcht, bei Erfolg dann ob
ab matcht und bei Erfolg dann ob
abc matcht. Bei
\[.*\] (habe non-greedy mal außen vor gelassen) würde die Engine also erst
\[ (1) suchen, bei Erfolg dann
\[.* (2) und bei Erfolg dann
\[.*\] (3). Das wäre wegen Schritt 2 recht übel, was die Laufzeit angeht, weil dabei eben nicht gestoppt wird, wenn das
] auftaucht, da dieser dritte Schritt in dem Fall noch gar nicht beachtet wird. Vielmehr wird erstmal stumpf bis zum Ende probiert (
.* = beliebige Anzahl beliebiger Zeichen) und sich danach per Backtracking "umständlich" der korrekten Zeichenkette angenähert. Beim Vorschlag von DasIch hingegen wird nicht über das Ziel hinausgeschossen, da
[^\]]+ für alle Zeichen außer dem
] matcht und dies wegen dem
+ nur bis zum ersten Failure wiederholt wird. Danach geht er sofort zum nächsten Teilausdruck über. Ist das so richtig erklärt?