Почему не работает этот ruby ​​regex? - PullRequest
1 голос
/ 25 января 2011

У меня есть очень простая задача регулярных выражений, которая привела меня в замешательство (и как раз тогда, когда я подумал, что я тоже начинаю понимать их).Я просто хочу проверить, что строка состоит из 11 цифр.Регулярное выражение, которое я использовал для этого, /\d{11}/.Насколько я понимаю, это даст совпадение, если будет точно (не больше и не меньше) 11 числовых символов (но, очевидно, мое понимание неверно).

Вот что происходит в irb:

ruby-1.9.2-p136 :018 > "33333333333" =~ /\d{11}/
 => 0 
ruby-1.9.2-p136 :019 > "3333333333" =~ /\d{11}/
 => nil 
ruby-1.9.2-p136 :020 > "333333333333" =~ /\d{11}/
 => 0 

Таким образом, хотя я получаю соответствующее совпадение для строки из 11 цифр и соответствующее несоответствие для строки из 10 цифр, я получаю совпадение для строки из 12 цифр!Я бы подумал, что /\d{11,}/ будет регулярным выражением для этого.

Кто-нибудь может объяснить мое недоразумение?

Ответы [ 2 ]

5 голосов
/ 25 января 2011

Без якорей предположение «не больше, не меньше» неверно.

/\d{5}/ 

соответствует

foo12345bar
   ^
   +---here

и

s123456yargh13337
 ^^         ^
 |+---here  |
 +----here  |
      here--+

Итак, вместо этого используйте:

/^\d{5}$/
1 голос
/ 25 января 2011

Строка из 12 цифр содержит подстроку, соответствующую вашему регулярному выражению.Если вы хотите точное соответствие, напишите регулярное выражение следующим образом: /^\d{11}$/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...