http://qs321.pair.com?node_id=393804

DaWolf has asked for the wisdom of the Perl Monks concerning the following question:

I know that this probably have been done zillions of times, but I have the nasty habit of reinventing some wheels (because I think it's the best way to learn), so I'd like to hear your opinions about this:

I have a RegEx that evaluates a form field to see if it's a "valid" e-mail address. So, I came to this:
([a-z]|[0-9])+((\.)+([a-z]|[0-9])+)*(\-|\_)*([a-z]|[0-9])*\@{1}([a-z]| +[0-9])+\.{1}([a-z]|[0-9]){2,}(\.([a-z|0-9]){2})*
Allow me to humbly explain each chunk:
  1. ([a-z]|[0-9])+ : One or more letters and/or numbers
  2. ((\.)+([a-z]|[0-9])+)* : Possibly a dot. Considering that there is a dot one or more letters and/or numbers must follow
  3. (\-|\_)* : Possibly a dash or underscore.
  4. ([a-z]|[0-9])* : Possibly more letters and/or numbers
  5. \@{1} : Must have one (and only one) '@'
  6. ([a-z]|[0-9])+ : Must have more letters and /or numbers followed by
  7. \.{1} : a dot that must be followed by
  8. ([a-z]|[0-9]){2,} : at least two letters and/or numbers
  9. (\.([a-z|0-9]){2})* : and possibly followed by a dot and more letters and/or numbers
So, my questions are:
  1. Have I forgot something here?
  2. Is there anything more that I could or should add?
Please don't send any ready-made regexes as I'm trying to really build this on my own.

Thanks in advance for your comments,