views:

3858

answers:

7

I'm working on a small project in VB.Net where I get a input from a textbox, and need to verify that this is an e-email address.

I found this expression "^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$", but i cant find any way to test if it passes.

I want some code like:

if not txtEmail.text = regexString then
    something happens..
else
    something else happens..
end if
+3  A: 

Use the System.Text.RegularExpressions.Regex class:

Function IsEmail(Byval email as string) as boolean
    Static emailExpression As New Regex("^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$")

    return emailExpression.IsMatch(email)
End Function
Joel Coehoorn
`If … Then Return True Else Return False` is surely in the all-time top ten of anti-patterns. :-/
Konrad Rudolph
Yeah: it's a bad habit I acquired at my last gig, where policy prevented returning the results of boolean expressions directly. Fix the sample.
Joel Coehoorn
I found that it needs to be "As New System.Text.RegularExpressions.Regex" where it says "As New Regex" Thx for the help :)
Duckers
Expression is broken. See http://stackoverflow.com/questions/369543/validating-e-mail-with-regular-expression-vbnet#369614
bzlm
Regex to match e-mail addresses is inherently broken. You can generate the *feeling* that you pretty much cover all your bases, but in the end there will nearly always be a valid pattern that you refuse, or an invalid one you let though. Yours does not cover apostrophes as valid, but they are.
Tomalak
The dots in that regex definitely need to be escaped. But the reges is inadequate for other reasons too.
Jan Goyvaerts
+3  A: 

There is a great website for this kind of thing, http://regexlib.com/. Not only does it have a tester application where you can paste in a regular expression and test it, but there is also a library of regular expressions you can use with community feedback on their validity, etc. I'm not a regex guru, so I go here when I need a quick regular expression.

Also, if you are thinking of developing regular expressions yourself, there is an excellent tool called Regex Buddy that will allow you to create and test your regular expressions on the fly using an easy to understand English interpretation of your regex.

Anderson Imes
+2  A: 

That regex isn't really complete... in fact... most aren't (check out this article, or this one).

Unless you really enjoy pain, regex isn't the right way to validate an email address.

chills42
A: 

Email address: RFC 2822 (simplified) Matches a normal email address. Does not check the top-level domain. Requires the "case insensitive" option to be ON.

Dim FoundMatch As Boolean
Try
    FoundMatch = Regex.IsMatch(txtEmail.text, "\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase)
Catch ex As ArgumentException
    'Syntax error in the regular expression
End Try

If Not FoundMatch Then
   Error = True
Else
   Error = False
End If
Mick
Expression is broken (for example, doesn't allow tld-only-addresses). See http://stackoverflow.com/questions/369543/validating-e-mail-with-regular-expression-vbnet#369614
bzlm
Example is not broken. It does not check top level domains. As I mentioned in my comment. See my other comment for one that does.
Mick
I will never understand why anybody would write an IF statement like your the last one in this snippet. That's just insane. It should be: Error = Not FoundMatch
Josh Stodola
Yes that would be briefer. I was going for general clarity. So now you know why anybody would write an IF statement like the last one in this snippet :-)
Mick
A: 

Email address: RFC 2822 (specific TLDs) Matches all country code top level domains, and specific common top level domains. Requires the "case insensitive" option to be ON.

To match Top Level Domains, use this:

Dim FoundMatch As Boolean
Try
    FoundMatch = Regex.IsMatch(txtEmail.Text, "\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b)\Z", RegexOptions.IgnoreCase)
Catch ex As ArgumentException
    'Syntax error in the regular expression
End Try

If Not FoundMatch Then
   Error = True
Else
   Error = False
End If
Mick
+4  A: 

Pick your favorite regex from my article on matching email addresses with a regex, and plug it into this Visual Basic code:

If Regex.IsMatch(SubjectString, "regex") Then
    Error = False
Else
    Error = True
End If

The best regex to match an email address is a controversial topic that I don't want to get into here. My article discusses the issues that you should be aware of when picking a regex. The regex in Joel Coehoorn's answer is definitely not a good one.

Jan Goyvaerts
Nice description of various trade-offs on the linked web page.
WileCau
+3  A: 

Possibly off-topic since it's not a regex solution, but you could just use some of the built in features of .NET 2.0:

try
{
   MailAddress email = new MailAddress(txtEmail.Text);
}
catch(FormatException fe)
{
   // output error
}
Rick