rails电子邮件验证格式和正则表达式

时间:2014-10-17 15:01:57

标签: ruby-on-rails regex testing ruby-on-rails-4 railstutorial.org

目前正在关注Michael Hartl rails教程

在rails中给出以下测试

  test "email validation should accept valid addresses" do
    valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org
                         first.last@foo.jp alice+bob@baz.cn]
    valid_addresses.each do |valid_address|
      @user.email = valid_address
      assert @user.valid?, "#{valid_address.inspect} should be valid"
    end
  end

  test "email validation should reject invalid addresses" do
    invalid_addresses = %w[user@example,com user_at_foo.org user.name@example.
                           foo@bar_baz.com foo@bar+baz.com]
    invalid_addresses.each do |invalid_address|
      @user.email = invalid_address
      assert_not @user.valid?, "#{invalid_address.inspect} should be invalid"
    end
  end

以及以下电子邮件格式验证的正则表达式

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }

有人可以向我解释测试正在测试的正则表达式吗?为什么有效测试只有user@example.com,USER @ foo.COM等。如果我将另一个元素添加到USER_EXAMPLE.COM的valid_addresses,该怎么办?为什么迈克尔专门选择上述5个示例电子邮件作为valid_addresses和5个invalid_addresses?

如果正则表达式测试所有格式并且仅返回特定格式,为什么我们需要进行测试呢?

2 个答案:

答案 0 :(得分:2)

让我们分解表达式(请记住i修饰符使其不区分大小写):

\A          (?# anchor to the beginning of the string)
[\w+\-.]+   (?# match 1+ a-z, A-Z, 0-9, +, _, -, or .)
@           (?# match literal @)
[a-z\d\-.]+ (?# match 1+ a-z, 0-9, -, or .)
\.          (?# match literal .)
[a-z]+      (?# match 1+ a-z)
\z          (?# anchor to the absolute end of the string)

这是教程定义为电子邮件的内容(实际上,它是much more complicated)。因此,作者迈克尔·哈特尔(Michael Hartl)为“有效”和“无效”(根据上述定义)电子邮件写了几个测试。

“用户”几乎可以是字母数字或包含_+-.。 “域”可以是字母数字或-.。而“TLD”只能是字母。前5封电子邮件使用这些先前规则的许多变体作为“可接受的”电子邮件。最后5封电子邮件因以下原因而失败:

  • user@example,com - ,无法匹配
  • user_at_foo.org - 没有@
  • user.name@example. - .
  • 之后没有TLD
  • foo@bar_baz.com - 域名不能包含_
  • foo@bar+baz.com - 域名不能包含+

显然,如果您希望更多特定电子邮件匹配(或不匹配),请将它们添加到测试数组中。如果您的测试失败,您知道您将需要更新您的表达式:)

答案 1 :(得分:0)

我认为尝试习惯正则表达式的最佳方法是尝试使用不同的正则表达式。如果您尝试使用Rubular.com(如本书中推荐的那样)并在正则表达式部分中粘贴:\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z。字母i出现在正则表达式后面的文本框中。然后,如果您在测试字符串部分中粘贴电子邮件地址:user @ example,com您将注意到电子邮件地址不匹配,但如果您用逗号替换逗号,那么它将匹配。第二个不正确的电子邮件地址只测试包含字符@(在这种情况下缺少)。

第3个不正确的电子邮件地址测试后缀包含1个或多个字母。 第4个不正确的电子邮件地址测试电子邮件地址中@后没有下划线。 第5个不正确的电子邮件地址测试电子邮件地址中@后面没有+字符。

正确的电子邮件地址基本上会测试相同的内容,但在这些电子邮件地址中,下划线和加号都在电子邮件地址的右侧。它还测试USER@foo.COM电子邮件地址是否保存在用户模型小写中:before_save { self.email = email.downcase }如果没有发生,则它将不是测试中的有效电子邮件地址。