Нужно составить регулярное выражение (RegEx) для исключения чисел, делящихся на 5 нацело

Нужно составить регулярное выражение (RegEx) для исключения чисел, делящихся на 5 нацело. 5, 10, 15, ... 12945 и так далее. Если число делиться на пять, то нам оно не нужно.

Сейчас я использую следующую регулярку: ^(?!(([1-9]{1,999}[05]{1,999})|5)).*?$

Логика следующая: Числа, заканчивающиеся на 0 или 5 кроме ноля, или 5. Но для числел с двумя или более нолями или с двумя или более пятёрками эта регулярка не срабатывает.

Как быть?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Ваше регулярное выражение (упрощу его до ^(?!([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
    • ) - конец незахватывающей подмаски
    • $ - конец строки
  • ) - конец блока предварительного просмотра вперёд.
→ Ссылка