Ruby regexp - 如何验证8位数字?

时间:2014-04-07 23:36:08

标签: ruby regex

我正在尝试验证前8位数的电话号码。 12345678

我创建了这个正则表达式模式[0-9]{8}唯一的问题是它还匹配一个超过8位数的电话号码。如何将正则表达式模式限制为8位?

2 个答案:

答案 0 :(得分:7)

说出你使用锚点的意思:

/\A\d{8}\z/

请注意,\A是Ruby中字符串的开头,^的开头,最后类似于\z$的结尾字符串或行。您几乎总是希望在Ruby中使用\A\z,否则您将遇到嵌入式换行问题。

答案 1 :(得分:1)

如果字符串是:

"12345678"

然后很容易匹配八位数字:

/\d{8}/

例如:

"12345678"[/\d{8}/] # => "12345678"

问题是,该模式中没有任何内容告诉引擎包含数字的字符串必须只有8,所以很高兴将字符串中的前8位数字与9位数字匹配:

"123456789"[/\d{8}/] # => "12345678"

如果数字是字符串中的唯一内容,那么通过添加锚点或边界标记,很容易告诉引擎它必须只找到一个只包含八位数的字符串:

"12345678"[/^\d{8}$/] # => "12345678"
"12345678"[/\A\d{8}\z/] # => "12345678"
"12345678"[/\b\d{8}\b/] # => "12345678"

"123456789"[/^\d{8}$/] # => nil
"123456789"[/\A\d{8}\z/] # => nil
"123456789"[/\b\d{8}\b/] # => nil

如果字符串只有八位数,则前两个工作正常。如果字符串包含除八位数之外的任何其他内容,则它们会失败:

" 12345678 "[/^\d{8}$/] # => nil
" 12345678 "[/\A\d{8}\z/] # => nil

为了解决这个问题,我们可以使用字边界标记,它也告诉引擎我们只需要八位数字,而无需将搜索锚定到字符串的开头或结尾:

"12345678"[/\b\d{8}\b/] # => "12345678"
" 12345678 "[/\b\d{8}\b/] # => "12345678"