Неверное регулярное выражение принимается Java.Это ошибка Java или пропущенная интерпретация ожиданий - PullRequest
1 голос
/ 14 мая 2019

Этот шаблон не является допустимым регулярным выражением в соответствии с несколькими веб-сайтами

groovy:000> java.util.regex.Pattern.compile("^*");
===> ^*

Но это же выражение в узле правильно понимает это:

$ node
> new RegExp('^*')
SyntaxError: Invalid regular expression: /^*/: Nothing to repeat

Кто здесь? Java, узел / интернет? Или я просто ожидаю чего-то от библиотек Java, чего не должен

1 Ответ

3 голосов
/ 14 мая 2019

Я бы сказал, что ссылки на инструменты тестирования регулярных выражений неверны (в смысле 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

Таким образом, соответствие бесконечному количеству совпадений нулевой ширины, как ^*, принимается спецификациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...