Ruby正则表达式。检测错误的电子邮件地址,例如“hi @ myio..io”

时间:2014-02-18 03:29:32

标签: ruby regex

检测错误的电子邮件地址,例如“hi @ myio..io”

  VALID_EMAIL_REGEX =      /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  VALID_EMAIL_REGEX_FULL = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

第一个失败。第二次成功。 我不明白这部分是如何与众不同的? (\.[a-z]+)*\.[a-z]

谢谢!

5 个答案:

答案 0 :(得分:1)

更好的答案是使用正则表达式来匹配电子邮件地址是一个坏主意。例如,所有有效地址活动。 hd1@jsc.d8u.us是我,hd2 @ jsc.d8u.us是现有的每个RFC的有效电子邮件地址,但它不是活动的电子邮件帐户。

如果你想进行电子邮件地址验证,你可能会比设置一个只接受字符串的Web服务更糟糕,使用JavaMail的地址解析(InternetAddress.parse()),throws an exception如果解析失败并返回地址,如果成功。示例代码如下:

public class ValidationServlet extends HttpServlet {
   protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String candid8Address = request.getParameter("email");
       try {
           InternetAddress.parse(candid8Address);
           response.setStatus(HttpServletResponse.SC_OK);
       } catch (AddressException e) {
           response.setStatus(HttpServletResponse.SC_NOT_FORBIDDEN);
       }
   }
}

如果您需要进一步的帮助,请告诉我......

答案 1 :(得分:0)

在第一个@[a-z\d\-.]中,.与包含.的任何字符匹配。应将其删除,以便域只匹配字母数字字符。它应该是:

/\A[\w+\-.]+@[a-z\d\-]+\.[a-z]+\z/i

答案 2 :(得分:0)

试试这个:

  

/ ^([\ w%的+ - 。] +)@([\瓦特 - ]。+)+([\ W] {2,})$ / I

验证电子邮件地址

答案 3 :(得分:0)

请尝试以下方法: -

/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i

答案 4 :(得分:0)

我曾经发现过这个:

# RFC822 Email Address Regexp
# ---------------------------
#
# Originally written by Cal Henderson
# c.f. http://iamcal.com/publish/articles/php/parsing_email/
#
# Translated to Ruby by Tim Fletcher, with changes suggested by Dan Kubb.
#
# Licensed under a Creative Commons Attribution-ShareAlike 2.5 License
# http://creativecommons.org/licenses/by-sa/2.5/
#
# (see: http://tfletcher.com/lib/rfc822.rb)
RFC822 = begin
  qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
  dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
  atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' +
    '\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
  quoted_pair = '\\x5c[\\x00-\\x7f]'
  domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
  quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
  domain_ref = atom
  sub_domain = "(?:#{domain_ref}|#{domain_literal})"
  word = "(?:#{atom}|#{quoted_string})"
  domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
  local_part = "#{word}(?:\\x2e#{word})*"

  # The following line was needed to change for ruby 1.9
  # was: addr_spec = "#{local_part}\\x40#{domain}"
  addr_spec = Regexp.new("#{local_part}\\x40#{domain}", nil, 'n')

  pattern = /\A#{addr_spec}\z/
end.freeze