Skip to content

Instantly share code, notes, and snippets.

@akshay-vishnoi
Created January 17, 2018 06:12
Show Gist options
  • Save akshay-vishnoi/1a1efb6bf3045e2d9dfbb0ba4e4b40d9 to your computer and use it in GitHub Desktop.
Save akshay-vishnoi/1a1efb6bf3045e2d9dfbb0ba4e4b40d9 to your computer and use it in GitHub Desktop.
# encoding: utf-8
# #
# # RFC822 Email Address Regex
# # --------------------------
# #
# # 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/
# #
# module RFC822
# EmailAddress = 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})*"
# addr_spec = "#{local_part}\\x40#{domain}"
# pattern = /\A#{addr_spec}\z/
# end
# end
# coding:utf-8
module RFC822
class Email
def self.compile(string)
Regexp.new string, nil, 'n'
end
# Patterns
QTEXT = compile "[^\\x0d\\x22\\x5c\\x80-\\xff]"
DTEXT = compile "[^\\x0d\\x5b-\\x5d\\x80-\\xff]"
ATOM_CORE = compile "[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+"
ATOM_EDGE = compile "[^\\x00-\\x20\\x22\\x28\\x29\\x2c-\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]"
ATOM = compile "(?:#{ATOM_EDGE}{1,2}|#{ATOM_EDGE}#{ATOM_CORE}#{ATOM_EDGE})"
QPAIR = compile "\\x5c[\\x00-\\x7f]"
QSTRING = compile "\\x22(?:#{QTEXT}|#{QPAIR})*\\x22"
WORD = compile "(?:#{ATOM}|#{QSTRING})"
DOMAIN_PT = compile "(?:[a-zA-Z0-9][\-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z0-9]+)"
DOMAIN = compile "#{DOMAIN_PT}(?:\\x2e#{DOMAIN_PT})*"
LOCAL_PT = compile "#{WORD}(?:\\x2e#{WORD})*"
ADDRESS = compile "#{LOCAL_PT}\\x40#{DOMAIN}"
REGEXP = /\A#{ ADDRESS }\z/
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment