Нужно составить регулярное выражение (RegEx) для исключения чисел, делящихся на 5 нацело
Нужно составить регулярное выражение (RegEx) для исключения чисел, делящихся на 5 нацело. 5, 10, 15, ... 12945 и так далее. Если число делиться на пять, то нам оно не нужно.
Сейчас я использую следующую регулярку: ^(?!(([1-9]{1,999}[05]{1,999})|5)).*?$
Логика следующая: Числа, заканчивающиеся на 0 или 5 кроме ноля, или 5. Но для числел с двумя или более нолями или с двумя или более пятёрками эта регулярка не срабатывает.
Как быть?
Ответы (1 шт):
Ваше регулярное выражение (упрощу его до ^(?!([1-9]{1,999}[05]{1,999}|5)).*$, так как нежадный квантификатор приведёт к идентичному результату, а одна из подмасок лишняя) находит любую строку, которая не начинается с (все регулярные выражения типа ^(?!<только-не-этот-шаблон>).*$ означают именно это) ([1-9]{1,999}[05]{1,999}|5), то есть с 5 или 1-999 отличных от нуля цифр, за которыми следует 1-999 цифр 0 или 5.
Вы можете использовать
^(?!(?:5|[1-9]\d*[05])$)
Если нужна поддержка нулей в начале строки, добавьте 0* в начало выражения:
^(?!0*(?:5|[1-9]\d*[05])$)
См. пример работы этого выражения
Подробности
^- начало строки(?!- начало негативного блока предварительного просмотра вперёд, который отменяет совпадение, если сразу после текущей позиции имеется0*- 0 и более нулей(?:- начало незахватывающей подмаски:5-5
|- или[1-9]- цифра, отличная от нуля\d*- 0 и более цифр[05]- цифра0или5
)- конец незахватывающей подмаски$- конец строки
)- конец блока предварительного просмотра вперёд.