为什么这个红宝石正则表达式不起作用?

时间:2011-01-25 09:35:42

标签: ruby regex

我有一个非常简单的正则表达式任务让我感到困惑(当我以为我开始得到它们的悬念时)。我只想检查字符串是否包含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 个答案:

答案 0 :(得分:5)

没有anchors,假设“不多也不少”是不正确的。

/\d{5}/ 

匹配

foo12345bar
   ^
   +---here

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

所以,改为使用:

/^\d{5}$/

答案 1 :(得分:1)

12位数字符串包含与正则表达式匹配的子字符串。如果您想要完全匹配,请按以下方式编写正则表达式:/^\d{11}$/