Gier verhält sich in JavaScript anders?

Dort wardiese Frage was mir klar machte, dass die Gier nach Quantifizierern in bestimmten Regex-Engines nicht immer gleich ist. Nehmen Sie den regulären Ausdruck von dieser Frage und ändern Sie ihn ein wenig:

!\[(.*?)*\]

(Ich weiß das* ist hier überflüssig, aber ich fand, dass das, was folgt, ein ziemlich interessantes Verhalten ist).

Und wenn wir versuchen, uns zu messen gegen:

![][][]

Ich habe erwartet, dass die erste Erfassungsgruppe leer sein wird, weil(.*?) ist faul und hört beim ersten mal auf] es kommt rüber. Das passiert in der Tat in:

PCREPythonabernicht Javascript wo es zum Ganzen passt][][. (jsfiddle)

Ich habe mich zum Beispiel mit einigen anderen Sprachen umgesehenRubin, Java, C # Aber alle verhalten sich so, wie ich es erwartet habe (d. h. sie geben leere Erfassungsgruppen zurück).

(RegexplanetenGolang Flavour bekommt offenbar auch nicht leere Capture-Gruppen)

Es scheint, dass die Regex-Engine von JavaScript die zweite interpretiert* umwandeln.*? von faul bis gierig. Beachten Sie, dass die zweite konvertiert* zu*? Scheint den regulären Ausdruck so zu machen, wie ich es erwartet habe (ebenso wie das vollständige Entfernen des Quantifizierers, weil ich weiß, dass er in dieser Situation überflüssig ist, aber darum geht es nicht).

* wurde in der Regex verwendet, aber dieses Verhalten ist ähnlich mit+, ? oder{m,n} Wenn Sie sie in ihre Lazy-Version konvertieren, erhalten Sie die gleichen Ergebnisse wie mit*?.

Weiß jemand, was wirklich passiert?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage