Rubular正则表达式与Rails正则表达式之间的差异

时间:2018-02-23 18:09:16

标签: ruby-on-rails ruby regex

我想验证美国的电话号码。在Rubular上,正则表达式:

/^\(?([2-9][0-8][0-9])\)?[-.●]?([2-9][0-9]{2})[-.●]?([0-9]{4})$/

与字符串不匹配:

'6463976583!'

正如我所料。但是,我使用正则表达式的Rails验证器:

validates :phone, presence: true, format: {with: /^\(?([2-9][0-8][0-9])\)?[-.●]?([2-9][0-9]{2})[-.●]?([0-9]{4})$/}

似乎允许使用相同的字符串。

有关我出错的地方的任何想法吗?

1 个答案:

答案 0 :(得分:0)

pry(main)> '6463976583!'[/^\(?([2-9][0-8][0-9])\)?[-.]?([2-9][0-9]{2})[-.]?([0-9]{4})$/]?([0-9]{4})$/]
=> nil
pry(main)> '6463976583'[/^\(?([2-9][0-8][0-9])\)?[-.]?([2-9][0-9]{2})[-.]?([0-9]{4})$/]
=> "6463976583"

也许尝试使用\ A和\ Z进行ActiveRecord验证:https://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_format_of

文档提到它匹配字符串的开头和结尾与一行的开头和结尾。如果你不使用^和$代替\ A或\ Z

,我相信Rails或Rubocop会抛出警告

如果你无法使用Rails验证器,你可以创建一个自定义验证器方法并在那里调用你的正则表达式