#ruby-on-rails #ruby #regex #match
#ruby-on-rails #ruby #регулярное выражение #совпадение
Вопрос:
Я использую Rails 4.2.7. Я хочу сопоставить шаблон, числа, произвольное количество пробелов и потенциальный » » в конце. Итак, я написал
2.3.0 :013 > /d s* ?/.match("40 ")
=> #<MatchData "40 ">
Однако это также соответствует
2.3.0 :012 > /d s* ?/.match("40-50")
=> #<MatchData "40">
Что дает? Строка «40-50» не соответствует предоставленному выражению, но очевидно, что я что-то не так делаю в своем регулярном выражении.
Комментарии:
1.
/(^d s* ?$)/
2. Вы забыли поместить маркеры «начало строки» / «конец строки» в ваше регулярное выражение
Ответ №1:
Если вы хотите, чтобы оно соответствовало только полной строке, используйте A
z
маркеры и . Вот так:
/Ad s* z$/.match("40-50")
Это заставит регулярное выражение соответствовать, только если ему соответствует полная строка.
В противном случае, как у вас сейчас, оно остановится, как только найдет совпадение в любом месте вашей строки.
d
означает одну цифру или более.
s*
означает необязательный пробел.
?
означает необязательный знак
Так 40
что соответствует этим условиям.
Комментарии:
1. Чтобы соответствовать полной строке , нужно использовать
A
/z
, а не ^/ $ .2. Да, ты прав, Серхио, я виноват. ^/$ найдет совпадение, если ваша строка многострочная, в то время как A/ Z не будет.
3. Да, в этом-то и проблема 🙂
4. кстати, лучше использовать
z
, а неZ
Ответ №2:
?
Квантификатор — ваша проблема
Вместо этого вы хотите следующее:
/d s* /.match("40-50")
Если вы используете ?
вместо
без квантора, знак вопроса изменяет оператор, чтобы означать «ноль или один из предыдущих атомов». С квантификатором 40-50
совпадает, поскольку он имеет нулевые
символы в строке.
Комментарии:
1. Знак плюс необязателен