Email Regular Expression Pattern

^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@
[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$

Description

^			#start of the line
  [_A-Za-z0-9-]+	#  must start with string in the bracket [ ], must contains one or more (+)
  (			#  start of group #1
    \\.[_A-Za-z0-9-]+	#     follow by a dot "." and string in the bracket [ ], must contains one or more (+)
  )*			#  end of group #1, this group is optional (*)
    @			#     must contains a "@" symbol
     [A-Za-z0-9]+       #        follow by string in the bracket [ ], must contains one or more (+)
      (			#	   start of group #2 - first level TLD checking
       \\.[A-Za-z0-9]+  #	     follow by a dot "." and string in the bracket [ ], must contains one or more (+)
      )*		#	   end of group #2, this group is optional (*)
      (			#	   start of group #3 - second level TLD checking
       \\.[A-Za-z]{2,}  #	     follow by a dot "." and string in the bracket [ ], with minimum length of 2
      )			#	   end of group #3
$			#end of the line

Whole combination is means, email address must start with “_A-Za-z0-9-” , optional follow by “.[_A-Za-z0-9-]“, and end with a “@” symbol. The email’s domain name must start with “A-Za-z0-9″, follow by first level Tld (.com, .net) “.[A-Za-z0-9]” and optional follow by a second level Tld (.com.au, .com.my) “\\.[A-Za-z]{2,}”, where second level Tld must start with a dot “.” and length must equal or more than 2 characters.

Java Regular Expression Example

Here’s a Java example to show the use of regex to validate an email address.

package com.mkyong.regex;
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class EmailValidator{
 
	  private Pattern pattern;
	  private Matcher matcher;
 
	  private static final String EMAIL_PATTERN = 
                   "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@
                   [A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
 
	  public EmailValidator(){
		  pattern = Pattern.compile(EMAIL_PATTERN);
	  }
 
	  /**
	   * Validate hex with regular expression
	   * @param hex hex for validation
	   * @return true valid hex, false invalid hex
	   */
	  public boolean validate(final String hex){
 
		  matcher = pattern.matcher(hex);
		  return matcher.matches();
 
	  }
}

Emails that match:

1. “mkyong@yahoo.com”, “mkyong-100@yahoo.com”,”mkyong.100@yahoo.com”
2. “mkyong111@mkyong.com”, “mkyong-100@mkyong.net”,”mkyong.100@mkyong.com.au”
3. “mkyong@1.com”, “mkyong@gmail.com.com”

Emails that doesn’t match:

1. “mkyong” – must contains “@” symbol
2. “mkyong@.com.my” – tld can not start with dot “.”
3. “mkyong123@gmail.a” – “.a” is not a valid tld, last tld must contains at least two characters
4. “mkyong123@.com” – tld can not start with dot “.”
5. “mkyong123@.com.com” – tld can not start with dot “.”
6. “.mkyong@mkyong.com” – email’s first character can not start with dot “.”
7. “mkyong()*@gmail.com” – email’s is only allow character, digit, underscore and dash
8. “mkyong@%*.com” – email’s tld is only allow character and digit
9. “mkyong..2002@gmail.com” – double dots “.” are not allow
10. “mkyong.@gmail.com” – email’s last character can not end with dot “.”
11. “mkyong@mkyong@gmail.com” – double “@” is not allow
12. “mkyong@gmail.com.1a” -email’s tld which has two characters can not contains digit

Unit Test

Here’s the unit test for above email validator.

package com.mkyong.regex;
 
import org.testng.Assert;
import org.testng.annotations.*;
 
/**
 * Email validator Testing
 * @author mkyong
 *
 */
public class EmailValidatorTest {
 
	private EmailValidator emailValidator;
 
	@BeforeClass
        public void initData(){
		emailValidator = new EmailValidator();
        }
 
	@DataProvider
	public Object[][] ValidEmailProvider() {
		return new Object[][]{
			{new String[] {
			   "mkyong@yahoo.com", "mkyong-100@yahoo.com",
                           "mkyong.100@yahoo.com" ,"mkyong111@mkyong.com", 
			   "mkyong-100@mkyong.net","mkyong.100@mkyong.com.au",
			   "mkyong@1.com", "mkyong@gmail.com.com"
	   	         }}
		 };
	}
 
	@DataProvider
	public Object[][] InvalidEmailProvider() {
		return new Object[][]{
			{new String[] {
			   "mkyong","mkyong@.com.my","mkyong123@gmail.a",
			   "mkyong123@.com","mkyong123@.com.com",
                           ".mkyong@mkyong.com","mkyong()*@gmail.com",
			    "mkyong@%*.com", "mkyong..2002@gmail.com",
			   "mkyong.@gmail.com","mkyong@mkyong@gmail.com", 
                           "mkyong@gmail.com.1a"
		        }}
		};
	}
 
	@Test(dataProvider = "ValidEmailProvider")
	public void ValidEmailTest(String[] Email) {
 
	   for(String temp : Email){
		boolean valid = emailValidator.validate(temp);
		System.out.println("Email is valid : " + temp + " , " + valid);
		Assert.assertEquals(true, valid);
	   }
 
	}
 
	@Test(dataProvider = "InvalidEmailProvider", 
        dependsOnMethods="ValidEmailTest")
	public void InValidEmailTest(String[] Email) {
 
	   for(String temp : Email){
		   boolean valid = emailValidator.validate(temp);
		   System.out.println("Email is valid : " + temp + " , " + valid);
		   Assert.assertEquals(false, valid);
	   } 
	}	
}

Unit Test – Result

Here’s the unit test result.

Email is valid : mkyong@yahoo.com , true
Email is valid : mkyong-100@yahoo.com , true
Email is valid : mkyong.100@yahoo.com , true
Email is valid : mkyong111@mkyong.com , true
Email is valid : mkyong-100@mkyong.net , true
Email is valid : mkyong.100@mkyong.com.au , true
Email is valid : mkyong@1.com , true
Email is valid : mkyong@gmail.com.com , true
Email is valid : mkyong , false
Email is valid : mkyong@.com.my , false
Email is valid : mkyong123@gmail.a , false
Email is valid : mkyong123@.com , false
Email is valid : mkyong123@.com.com , false
Email is valid : .mkyong@mkyong.com , false
Email is valid : mkyong()*@gmail.com , false
Email is valid : mkyong@%*.com , false
Email is valid : mkyong..2002@gmail.com , false
Email is valid : mkyong.@gmail.com , false
Email is valid : mkyong@mkyong@gmail.com , false
Email is valid : mkyong@gmail.com.1a , false
PASSED: ValidEmailTest([Ljava.lang.String;@1a626f)
PASSED: InValidEmailTest([Ljava.lang.String;@1975b59)
 
===============================================
    com.mkyong.regex.EmailValidatorTest
    Tests run: 2, Failures: 0, Skips: 0
===============================================
 
===============================================
mkyong
Total tests run: 2, Failures: 0, Skips: 0
===============================================

Reference

  1. http://en.wikipedia.org/wiki/E-mail_address
  2. http://tools.ietf.org/html/rfc2822#section-3.4.1
Any Java questions or problems? please post at this JavaNullPointer.com forum, see you there ~
[ Read More ] You can find more similar articles at Java RegEx Tutorials