Ваше регулярное выражение безопасно, но только из-за "\".
Тестирование на regex101.com показывает, что нет никаких комбинаций входных данных, которые создают неконтролируемые проверки - но ваше регулярное выражение ОЧЕНЬ близко к уязвимости,так что будьте осторожны при его изменении.
Как вы уже читали, катастрофический откат происходит, когда два квантификатора находятся рядом друг с другом. В вашем случае, регулярное выражение расширяется до \d+\.\d+\.\d+\.\d+\. ...
и так далее. Поскольку вы делаете точку, необходимую для каждого совпадения между \d+
, ваше регулярное выражение увеличивается всего на три шага для каждого добавляемого числа периода. (Это означает 4 шага на номер периода, если вы ставите недопустимый символ в конце.) Это линейный темп роста, поэтому с вашим регулярным выражением все в порядке. Демо
Однако, , если вы сделаете необязательный параметр \.
, случайно забудете escape-символ, чтобы сделать его простым .
, или удалите его вообще, тогда у вас проблемы. Такое регулярное выражение позволило бы катастрофическое возвращение назад;неверный символ в конце примерно удваивает время выполнения с каждым дополнительным числом, которое вы добавляете перед ним. Это экспоненциальный темп роста, и этого достаточно, чтобы crash превысил настройки по умолчанию для движка regex101 с 18 цифрами и 1 недопустимым символом. Демо
Как написано, с вашим регулярным выражением все в порядке, и оно останется таким, пока вы убедитесь, что между первым \d+
и вторым \d+
есть что-то "твердое", кака также нечто «твердое» между вторым \d+
и *
вне его группы захвата.