Жадность ведет себя по-другому в JavaScript?

Там былоэтот вопрос что заставило меня понять, что жадность квантификаторов не всегда одинакова в некоторых двигателях регулярных выражений. Взяв регулярное выражение из этого вопроса и немного изменив его:

!\[(.*?)*\]

(Я знаю это* здесь избыточно, но я обнаружил, что то, что следует, довольно интересное поведение).

И если мы попытаемся сопоставить с:

![][][]

Я ожидал, что первая группа захвата будет пустой, потому что(.*?) ленится и остановится на первом] это сталкивается. Это действительно то, что происходит в:

PCREпитонноне Javascript где это соответствует целому][][, (jsfiddle)

Я смотрел вокруг с некоторыми другими языками, напримерРубин, Ява, C # но все ведут себя так, как я ожидал (т.е. возвращаю пустые группы захвата).

(regexplanet-хgolang аромат видимо тоже получает непустые группы захвата)

Похоже, что механизм регулярных выражений JavaScript интерпретирует второй* для преобразования.*? от ленивого до жадного. Обратите внимание, что преобразование второго* в*? похоже, что регулярное выражение работает так, как я ожидал (как и полное удаление квантификатора, потому что я знаю, что в этой ситуации он избыточен, но это не главное).

* был использован в регулярном выражении, но это поведение аналогично+, ? или же{m,n} и преобразование их в их ленивую версию дает те же результаты, что и с*?.

Кто-нибудь знает, что на самом деле происходит?

Ответы на вопрос(3)

Ваш ответ на вопрос