匹配方法的正则表达式问题

时间:2011-02-17 17:54:20

标签: ruby-on-rails ruby regex

我希望使用正则表达式验证许多邮件(一个或多个),但此属性不属于任何模型。所以我写了一个方法:

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(正则表达式).nil?返回false(因此字符串有效,但此字符串不正确)

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

提前致谢。

1 个答案:

答案 0 :(得分: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