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

1wnzp6jl  于 2023-03-13  发布在  其他
关注(0)|答案(3)|浏览(119)

当前正在学习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等。如果我在valid_addresses中添加另一个元素USER@ EXAMPLE. COM会怎样?为什么Michael特别选择上面的5个示例电子邮件作为valid_addresses和5个invalid_addresses?
如果正则表达式测试所有格式,并且只返回一个特定的格式,那么我们还需要测试什么呢?

6yoyoihd

6yoyoihd1#

让我们分解表达式(记住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-域不能包含+

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

fhg3lkii

fhg3lkii2#

在2023年为每个入住的人。
您可以用途:

validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
5tmbdcev

5tmbdcev3#

我认为习惯正则表达式的最好方法是尝试不同的正则表达式,如果你尝试使用Rubular.com(就像书中推荐的那样)并粘贴:\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z。字母i出现在正则表达式后面的文本框中。如果您在测试字符串部分粘贴电子邮件地址:user@example,com你会注意到电子邮件地址不匹配,但是如果你用一个点替换逗号,那么它就会匹配。第二个不正确的电子邮件地址只是测试字符@是否包含在内(在本例中没有)。
第三个错误的电子邮件地址测试后缀包含一个或多个字母。第四个错误的电子邮件地址测试电子邮件地址中的@后面没有下划线。第五个错误的电子邮件地址测试电子邮件地址中的@后面没有+字符。
正确的电子邮件地址基本上测试相同的事情,但在这些电子邮件地址中下划线和加号是在电子邮件地址的右边部分,它还测试USER@foo.COM电子邮件地址是否以用户模型的小写形式保存:before_save { self.email = email.downcase }如果没有出现这种情况,则它在测试中不是有效的电子邮件地址。

相关问题