Тормозной мастер недостаточно проверяет предупреждение о регулярных выражениях якорей

Я пытаюсь реализовать валидацию в такой модели.

validates_format_of :field, with: /[0-9]/, message: 'must have at least one number (0-9)'

Тормоз обнаруживает это Format Validation вопрос безопасности, и он рекомендует добавлять якоря между регулярным выражением.

Недостаточная проверка для "поля" с использованием /[0-9]/. Используйте \A и \z в качестве якорей возле линии 54

Если я добавлю эти якоря, регулярное выражение перестанет работать, поэтому я не знаю, что делать в этом случае. Вот тесты, которые я сделал, используя rails c,

"asdf1234".match(/\A[0-9]\z/) # => nil
"foobar1".match(/\A[0-9]\z/) # => nil

Мне нужно чтобы метод возвращался #<MatchData "1"> в обоих случаях.

Есть идеи? Благодарю.

1 ответ

Решение

Если вам нужно сопоставить строку, которая содержит как минимум 1 цифру внутри, и любые другие символы до и после, вы можете использовать

/\A[^0-9]*[0-9].*\z/m

или просто

/\A.*[0-9].*\z/m

подробности

  • \A - начало строки
  • [^0-9]* - ноль или более символов, отличных от цифры ASCII
  • [0-9] - цифра ASCII
  • .* - любые 0+ символов, как можно больше, до
  • \z конец строки.

m модификатор делает . соответствует любому символу, включая символ разрыва строки.

На самом деле, /\A.*[0-9].*\z/m будет немного медленнее, как первый .* захватит всю строку сразу и затем вернется назад, чтобы найти последнюю цифру. Первый более оптимизирован.

Другие вопросы по тегам