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