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

Ruby on rails rails电子邮件验证格式和正则表达式,ruby-on-rails,regex,testing,ruby-on-rails-4,railstutorial.org,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_add

目前正在学习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. 为什么Michael特别选择上述5封示例电子邮件作为有效的\u地址和5封无效的\u地址


如果正则表达式测试所有格式,并且只返回一个特定的格式,那么我们为什么还需要测试呢?

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


这就是本教程所定义的电子邮件(实际上是电子邮件)。因此,作者迈克尔·哈特尔(MichaelHartl)为“有效”和“无效”(根据上述定义)电子邮件编写了两个测试

“用户”可以是字母数字,也可以包含
。“域”可以是字母数字或
-。
。“TLD”只能是字母。前5封电子邮件使用了上述规则的许多变体作为“可接受”电子邮件。最后5封电子邮件失败的原因如下:

  • user@example,com
    -
    无法匹配
  • user\u在_foo.org
    -否
    @
  • 用户。name@example.
    -在
    之后没有TLD
  • foo@bar_baz.com
    -域不能包含
  • foo@bar+baz.com
    -域不能包含
    +

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

我认为尝试使用正则表达式的最好方法是尝试使用不同的正则表达式。如果您尝试使用(如本书中推荐的)并在正则表达式部分粘贴:
\A[\w+\-.]+@[A-z\d\-.]+\.[A-z]+\z
。字母
i
位于正则表达式后面的文本框中。然后,如果在测试字符串部分粘贴电子邮件地址:user@example,com您会注意到电子邮件地址不匹配,但如果您将逗号替换为点,则它将匹配。第二个不正确的电子邮件地址只是测试是否包含字符@(本例中缺少该字符)

第三个错误的电子邮件地址测试后缀是否包含1个或多个字母。 第四个不正确的电子邮件地址测试电子邮件地址中@之后没有下划线。 第五个不正确的电子邮件地址测试电子邮件地址中@之后没有+字符


正确的电子邮件地址基本上测试相同的内容,但在这些电子邮件地址中,下划线和加号位于电子邮件地址的正确部分。它还测试了USER@foo.COM电子邮件地址以用户模型小写形式保存:
before_save{self.email=email.downcase}
如果没有发生这种情况,它在测试中不是有效的电子邮件地址。

不确定您的问题是什么。。测试使用提供的正则表达式确保无效电子邮件无效,有效电子邮件有效。如果你想知道为什么要进行单元测试,我知道我的问题很混乱,所以我想我只想知道在这种情况下,测试是为了什么,逐行测试。Michael提出的测试并不详尽。他挑选了一些有效电子邮件地址和一些无效电子邮件地址的示例,以确保正则表达式能够捕获这些情况。他试图找出输入无效地址时的典型错误,以及仍然有效的不寻常的组合。我们进行测试以确保在验证部分输入的正则表达式上没有输入错误。@user3277633我略过了答案中的要点,但我不会使用上面的表达式作为最终解决方案。它非常松散,将包含大量误报以及拒绝一些有效电子邮件。一些误报:需要至少到个字符,(子)域不能以句点开始/结束,等等(注意,我不希望您一定要使用这个)。
\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)