我正在尝试验证前8位数的电话号码。 12345678
我创建了这个正则表达式模式[0-9]{8}
唯一的问题是它还匹配一个超过8位数的电话号码。如何将正则表达式模式限制为8位?
答案 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"