Hi Ryan!
"Ryan" schrieb
I am using the following MICROSOFT SUGGESTED (somewhere on msdn)
regular expression to validate email addresses however I understand
that the RFP allows for "+" symbols in the email address and this
method does not....
Does anyone have an explanation?
A real RFC-822-compliant regex ist very big and complicated.
Have a look at this:
http://www.codeproject.com/csharp/RFC822Validator.asp
This is the one and only RFC-822-compliant regex:
[\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80-\
xff\n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\))
[^\\\x80-\xff\
n\015()] *)*\)
[\040\t]* )*(?'mailbox'(?'localpart'(?:[^(\040)<>\@,;:\".\\\[\]\0
00-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff])|(?'quotedstr'\
"[^\\\x80-\xff\n\015"] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )*\"))
[\04
0\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80-\xff\
n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\))
[^\\\x80-\xff\n\01
5()] *)*\) [\040\t]* )*(?:\. [\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?:
\\
[^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\x80-\xff\n
\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*
(?:[^(\040)<>\@,;:\".\\
\[\]\000-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff])|(?'quote
dstr'\"[^\\\x80-\xff\n\015"] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"]
* )*\")
) [\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80
-\xff\n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\))
[^\\\x80-\xf
f\n\015()] *)*\) [\040\t]* )*)*) \@ [\040\t]*(?: \( [^\\\x80-\xff\n\015()]
*(?:(
?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\x80
-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*
(?'domain'(?:[^(
\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037\x8
0-\xff])|\[(?: [^\\\x80-\xff\n\015\[\]"] | \\
^\x80-\xff] )*\])[\040\t]*(?: \
( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80-\xff\n\015()] *
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()]
*)*\)
[\040\t]* )*(:?\. [\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\
[^\x80-\xf
f] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\x80-\xff\n\015()] *)
*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*
(?:[^(\040)<>\@,;:\".\\\[\]\000-\
037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff])|\[(?:
[^\\\x80-\xf
f\n\015\[\]"] | \\ [^\x80-\xff] )*\])[\040\t]*(?: \(
[^\\\x80-\xff\n\015()] *(
?:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\
x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\)
[\040\t]* )*)*)|(?:[^(\040
)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\x
ff])|(?'quotedstr'\"[^\\\x80-\xff\n\015"] *(?: \\ [^\x80-\xff]
[^\\\x80-\xff\n\
015"] * )*\"))[^()<>\@,;:\".\\\[\]\x80-\xff\000-\010\012-\037](?:(?: \(
[^\\\x80
-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\
[^\
x80-\xff] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) |
(?'quot
edstr'\"[^\\\x80-\xff\n\015"] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"]
* )*\"
) )[^()<>\@,;:\".\\\[\]\x80-\xff\000-\010\012-\037] *)* < [\040\t]*(?: \(
[^\\\x
80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?:
\\ [
^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\)
[\040\t
]* )*(?: \@ [\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff]
| \
( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()]
*)*\)) [^
\\\x80-\xff\n\015()] *)*\) [\040\t]* )*
(?'domain'(?:[^(\040)<>\@,;:\".\\\[\]\00
0-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff])|\[(?:
[^\\\x80-
\xff\n\015\[\]"] | \\ [^\x80-\xff] )*\])[\040\t]*(?: \(
[^\\\x80-\xff\n\015()]
*(?:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^
\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*(:?\.
[\040
\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80-\xff\n
\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\))
[^\\\x80-\xff\n\015
()] *)*\) [\040\t]* )*
(?:[^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\040
)<>\@,;:\".\\\[\]\000-\037\x80-\xff])|\[(?: [^\\\x80-\xff\n\015\[\]"] | \\
[^\x
80-\xff] )*\])[\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\
[^\x80-\xff]
| \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()]
*)*\))
[^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*)*)(?: , [\040\t]*(?: \(
[^\\\x80-\xff
\n\015()] *(?:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\
[^\x80-\
xff] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\)
[\040\t]* )* \
@ [\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80
-\xff\n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\))
[^\\\x80-\xf
f\n\015()] *)*\) [\040\t]* )*
(?'domain'(?:[^(\040)<>\@,;:\".\\\[\]\000-\037\x80
-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff])|\[(?:
[^\\\x80-\xff\n\015
\[\]"] | \\ [^\x80-\xff] )*\])[\040\t]*(?: \( [^\\\x80-\xff\n\015()]
*(?:(?:
\\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\x80-\xf
f\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*(:?\.
[\040\t]*(?: \(
[^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80-\xff\n\015()] *(
?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()]
*)*\)
[\040\t]* )*
(?:[^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>\@,;:\"
..\\\[\]\000-\037\x80-\xff])|\[(?: [^\\\x80-\xff\n\015\[\]"] | \\
[^\x80-\xff]
)*\])[\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\
x80-\xff\n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\))
[^\\\x80-
\xff\n\015()] *)*\) [\040\t]* )*)*))*:[\040\t]*(?: \( [^\\\x80-\xff\n\015()]
*(?
:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\x
80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\)
[\040\t]* )* )?(?'localpart
'(?:[^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-
\037\x80-\xff])|(?'quotedstr'\"[^\\\x80-\xff\n\015"] *(?: \\ [^\x80-\xff]
[^\\\
x80-\xff\n\015"] * )*\")) [\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\
[^\
x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\x80-\xff\n\01
5()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*(?:\. [\040\t]*(?: \(
[^\\\
x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?:
\\
[^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\)
[\040\
t]* )*
(?:[^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\
]\000-\037\x80-\xff])|(?'quotedstr'\"[^\\\x80-\xff\n\015"] *(?: \\
[^\x80-\xff]
[^\\\x80-\xff\n\015"] * )*\")) [\040\t]*(?: \( [^\\\x80-\xff\n\015()]
*(?:(?:
\\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff]
[^\\\x80-\xf
f\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*)*) \@
[\040\t]*(?: \
( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80-\xff\n\015()] *
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()]
*)*\)
[\040\t]* )*
(?'domain'(?:[^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\04
0)<>\@,;:\".\\\[\]\000-\037\x80-\xff])|\[(?: [^\\\x80-\xff\n\015\[\]"] | \\
[^\
x80-\xff] )*\])[\040\t]*(?: \( [^\\\x80-\xff\n\015()] *(?:(?: \\
[^\x80-\xff]
| \( [^\\\x80-\xff\n\015()] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()]
*)*\)
) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*(:?\. [\040\t]*(?: \(
[^\\\x80-\xff\n
\015()] *(?:(?: \\ [^\x80-\xff] | \( [^\\\x80-\xff\n\015()] *(?: \\
[^\x80-\xf
f] [^\\\x80-\xff\n\015()] *)*\)) [^\\\x80-\xff\n\015()] *)*\) [\040\t]* )*
(?:
[^(\040)<>\@,;:\".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>\@,;:\".\\\[\]\000-\037
\x80-\xff])|\[(?: [^\\\x80-\xff\n\015\[\]"] | \\
^\x80-\xff] )*\])[\040\t]*(?
: \( [^\\\x80-\xff\n\015()] *(?:(?: \\ [^\x80-\xff] | \(
[^\\\x80-\xff\n\015()
] *(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] *)*\))
[^\\\x80-\xff\n\015()] *)
*\) [\040\t]* )*)*)>)
Cheers
Arne Janning