【问题标题】:Regex problem with match method匹配方法的正则表达式问题
【发布时间】:2011-02-18 02:04:30
【问题描述】:

我想用正则表达式验证许多邮件(一个或多个),但这个属性不属于任何模型。于是我写了一个方法:

def emails_are_valid?(emails)
     #regex with validation  
     regex = Regexp.new("^(\s*[a-zA-Z0-9\._%-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}\s*([,]{1}[\s]*[a-zA-Z0-9\._%-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}\s*)*)$")
     #if the quantity of emails is zero o its validations is bad return false.   
     if emails.blank? || emails.match(regex).nil?
          return false
        else
          return true
        end
end

我评估这个字符串 mm@somedomain.com aa, mma@somedomain.com 当 我在http://www.rubular.com/ 中测试了这个正则表达式不好(没有匹配)。 所以根据这个页面我的正则表达式是好的。

但是当我评估 emails.match(regex).nil 时呢?返回错误(所以字符串是有效的,但这个字符串是坏的)

我需要帮助。我的正则表达式不好还是我的 emails_are_valid?方法错误或匹配方法错误。

提前致谢。

【问题讨论】:

  • 阅读Regexp recognition of email address hard? 看看您是否真的想尝试使用正则表达式验证电子邮件地址,或者只是了解电子邮件是否真的会发送到地址。不同之处在于拥有一个看起来不错的地址,或者拥有一个您知道是好的地址。 Search StackOverflow 类似问题。
  • @the Tin Man 我想验证格式,我想验证邮件的格式以及逗号分隔的列表,无论它们与逗号之间的空间量如何。但是,当我放置一个空格 + 歌词 + 昏迷 + other_mail 时,匹配方法返回就好像它是正确的一样

标签: ruby-on-rails ruby regex


【解决方案1】:

在声明正则表达式时,您应该使用单引号而不是双引号,否则 \s 会被解析为转义序列。

将该行更改为

 regex = Regexp.new('^(\s*[a-zA-Z0-9\._%-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}\s*([,]{1}[\s]*[a-zA-Z0-9\._%-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}\s*)*)$')

这个方法会奏效。

顺便说一句,这将是做同样事情的一种更简洁的方式 - http://codepad.org/YbsqIkcP

【讨论】:

  • 谢谢。我不敢相信问题出在双引号上,但这就是问题所在。
猜你喜欢
  • 2011-07-17
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多