Жадность ведет себя по-другому в JavaScript?
Там былоэтот вопрос что заставило меня понять, что жадность квантификаторов не всегда одинакова в некоторых двигателях регулярных выражений. Взяв регулярное выражение из этого вопроса и немного изменив его:
!\[(.*?)*\]
(Я знаю это*
здесь избыточно, но я обнаружил, что то, что следует, довольно интересное поведение).
И если мы попытаемся сопоставить с:
![][][]
Я ожидал, что первая группа захвата будет пустой, потому что(.*?)
ленится и остановится на первом]
это сталкивается. Это действительно то, что происходит в:
][][
, (jsfiddle)Я смотрел вокруг с некоторыми другими языками, напримерРубин, Ява, C # но все ведут себя так, как я ожидал (т.е. возвращаю пустые группы захвата).
(regexplanet-хgolang аромат видимо тоже получает непустые группы захвата)
Похоже, что механизм регулярных выражений JavaScript интерпретирует второй*
для преобразования.*?
от ленивого до жадного. Обратите внимание, что преобразование второго*
в*?
похоже, что регулярное выражение работает так, как я ожидал (как и полное удаление квантификатора, потому что я знаю, что в этой ситуации он избыточен, но это не главное).
*
был использован в регулярном выражении, но это поведение аналогично+
, ?
или же{m,n}
и преобразование их в их ленивую версию дает те же результаты, что и с*?
.
Кто-нибудь знает, что на самом деле происходит?