Я бы сказал, что ссылки на инструменты тестирования регулярных выражений неверны (в смысле PCRE).Я думаю, что это так, потому что реализации JS обрабатывают эти совпадения по-разному (см .: https://github.com/gskinner/regexr/issues/28)
Обратите внимание, что и regexr, и regex101 принимают ^()*
и (^)*
. Кроме того, Perl v5.18.2 не имеет проблем сэто: запуск echo "ubar" | perl -ne "s/^*/F/; print;"
из моего терминала не приводит к предупреждениям и ошибкам и выдает: Fubar
.
Это то, что сказано в спецификации PCRE:
Возможно построитьбесконечные циклы, следуя подшаблону, который не может соответствовать ни одному символу, с квантификатором, который не имеет верхнего предела, например:
(a?) *
Более ранние версии Perl и PCRE, используемые для полученияошибка во время компиляции для таких шаблонов. Однако, поскольку есть случаи, когда это может быть полезно, такие шаблоны теперь принимаются, но если какое-либо повторение подшаблона фактически не соответствует ни одному символу, цикл принудительно прерывается.
- https://www.pcre.org/original/doc/html/pcrepattern.html
Таким образом, соответствие бесконечному количеству совпадений нулевой ширины, как ^*
, принимается спецификациями.