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

标签 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 等。如果我向 valid_addresses 添加另一个元素,即 USER@EXAMPLE.COM 会怎么样。为什么 Michael 专门选择上述 5 个示例电子邮件作为 valid_addresses 和 5 个 invalid_addresses?

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

最佳答案

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

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

关于ruby-on-rails - rails 电子邮件验证格式和正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26427895/

相关文章:

ruby-on-rails - 使用 PG 备份将数据库导入 Heroku 上的应用程序

regex - 使用 Notepad++ 正则表达式在url中用破折号替换下划线

java - 使用马拉松作为 GUI 测试

php - Behat - 检查损坏的图像链接

ruby-on-rails - Rails 打包器 : "Could not find tilt-1.3.5 in any of the sources"

ruby-on-rails - 类型错误 : superclass mismatch for class Task

ruby-on-rails - capybara rspec 匹配器相当于 response.should have_selector "form", :action => some_path

Mysql使用正则表达式替换

c# - 将 MatchCollection 转换为字符串数组

自定义测试命令的 Python setup.py 测试依赖项