Почему мое выражение соответствует чему-то, что явно не соответствует выражению?

#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. Знак плюс необязателен