Chciwość zachowująca się inaczej w JavaScript?

Tam byłoto pytanie co uświadomiło mi, że chciwość kwantyfikatorów nie zawsze jest taka sama w niektórych silnikach regex. Biorąc regex z tego pytania i trochę go modyfikując:

!\[(.*?)*\]

(Wiem to* jest tutaj zbędny, ale odkryłem, że to, co następuje, jest dość interesującym zachowaniem).

A jeśli spróbujemy dopasować:

![][][]

Spodziewałem się, że pierwsza grupa przechwytująca będzie pusta, ponieważ(.*?) jest leniwy i zatrzyma się na pierwszym] przychodzi. To właśnie dzieje się w:

PCREPytonalenie Javascript gdzie pasuje do całości][][. (jsfiddle)

Rozejrzałem się na przykład za pomocą innych językówrubin, Jawa, DO# ale wszyscy zachowują się tak, jak się tego spodziewałem (tj. zwracają puste grupy przechwytywania).

(regexplanet'sgolang smak najwyraźniej również pobiera niepuste grupy przechwytywania)

Wygląda na to, że silnik regex JavaScript interpretuje drugi* przekonwertować na.*? od leniwych do chciwych. Zauważ, że konwersja drugiej* do*? wydaje się, że regex działa tak, jak oczekiwałem (podobnie jak całkowite usunięcie kwantyfikatora, ponieważ wiem, że w tej sytuacji jest zbędny, ale nie o to chodzi).

* został użyty w wyrażeniu regularnym, ale to zachowanie jest podobne z+, ? lub{m,n} Przekształcenie ich w leniwą wersję daje takie same wyniki, jak w przypadku*?.

Czy ktoś wie, co się naprawdę dzieje?

questionAnswers(3)

yourAnswerToTheQuestion