2016-01-11 5 views
2

У меня есть поле «полы», и я хочу, чтобы он принимал только числа, запятые и пробелы.validates_format_of в рельсах (только цифры, запятые и пробелы)

Я использую validates_format_of :floors, :with => /[0-9\,\s]+/ прямо сейчас, но он работает плохо, потому что он принимает строку типа «1, 2, abc».

Пожалуйста, помогите мне найти свою ошибку.

+1

Используйте анкеры: '/ \ A [0-9, \ s] + \ г /'. Но это также будет соответствовать строкам ',,, 123, 33, 33'. Вы хотите только совместить числа с плавающей точкой? –

+0

Спасибо. Пожалуйста, разместите его как ответ, чтобы я мог отметить его как принятый. Также возможно вы можете немного объяснить – Zelenka

+0

Было бы здорово, если первый символ должен быть числом (а не запятой) – Zelenka

ответ

2

Ваши регулярные выражения 1, 2, внутри 1, 2, abc, это частичное совпадение. Чтобы запретить частичные совпадения, используйте привязки start-of-string и end-of-string.

В Ruby, чтобы соответствовать началу строки, вам необходимо использовать якорь \A. Анкер конца строки - \z. Таким образом, использовать

/\A[0-9,\s]+\z/ 

См regex demo

Также отметим, что , не является специальным регулярное выражение метасимволом и не нужно бежать.

Если вам нужно начать с номером, вы можете использовать

/\A\d[\d,\s]*\z/ 

Здесь \d потребуется цифра появится в начале, а затем он может следовать с цифрами, пробелами и запятыми, ноль или больше случаев. Другой способ ограничить общий класс символов - использовать lookahead: \A(?=\d)[\d,\s]+\z.

Двигаясь дальше, вы можете сопоставить числа как 1,300,567.567 или 1 300 567.567 с

/\A\d{1,3}(?:[,\s]\d{3})*(?:\.\d+)?\z/ 

См another demo

+0

Спасибо за такой подробный ответ! – Zelenka

+1

Я добавил еще несколько на всякий случай :) Рад помочь. Вы можете дополнительно проверить эти шаблоны на [regex101.com] (http://regex101.com), чтобы увидеть, какой вариант работает для вас лучше всего. –

Смежные вопросы