Java Program - Email address verification using Strings and RegEx

38,529

If you insist on using regex you can use this but without validating properly you could be in for all kinds of trouble

static Pattern emailPattern = Pattern.compile("[a-zA-Z0-9[!#$%&'()*+,/\-_\.\"]]+@[a-zA-Z0-9[!#$%&'()*+,/\-_\"]]+\.[a-zA-Z0-9[!#$%&'()*+,/\-_\"\.]]+");

public static boolean isValidEmail(String email) {

    Matcher m = emailPattern.matcher(email); return !m.matches();

}

Or alternatively you could use

public static boolean isValidEmailAddress(String email) {
   boolean result = true;
   try {
      InternetAddress emailAddr = new InternetAddress(email);
      emailAddr.validate();
   } catch (AddressException ex) {
      result = false;
   }
   return result;
}

Which is a core java utility which would be better...

Note that neither of these will guarentee an address is actually valid, just that it is correctly formed and so hypothetically could exist

String email_regex = "[A-Z]+[a-zA-Z_]+@\b([a-zA-Z]+.){2}\b?.[a-zA-Z]+";
String testString = "[email protected]";
Boolean b = testString.matches(email_regex);
System.out.println("String: " + testString + " :Valid = " + b);

will check for the last three constraints which you can then combine with

string.length()>3 && string.length()<20
Share:
38,529
user2377778
Author by

user2377778

Updated on May 14, 2020

Comments

  • user2377778
    user2377778 almost 4 years

    The problem statement goes like this:

    We need to create a String data type called emailId

    The email ID has to be set using appropriate setter methods.

    The validation rules for the email ID check have to be implemented in the main().

    Conditions are:

    1. Overall length of the email ID must be >3 and <20.

    2. The emailId must include "@" followed by a minimum of 1 and maximum of 2 "." characters.

    3. The substring before "@" must contain a combination of Upper Case, Lower Case and "_"(underscore) symbols.

    4. The first letter of the email Id must be in Upper Case.

    If all the above conditions are valid, it should display "Email ID is valid" or else, it should display an appropriate error message

    This is my code:

    public class EmailCheck {
    
    String emailId;
    public void setEmailId(String emailId){
        this.emailId=emailId;
    }
    public String getEmailId(){
        return emailId;
    }
    public static void main(String[] args) {
        EmailCheck em = new EmailCheck();
        em.setEmailId("[email protected]");
        String email = em.getEmailId();
        int length = email.length();
        boolean flag1 = false;
        boolean flag2 = false;
        boolean flag3 = false;
        boolean flag4 = false;
        boolean flag5 = false;
        boolean flag6 = false;
        boolean flag7 = false;
        int count = 0;
    
    
        //Condition 1 
        if((length>3 && length<20)== true)
            flag1 = true;
        else 
            flag1 = false;
    
        //Condition 2
            int temp = email.length();
            if(email.contains("@")){
                flag2=true;
                int a=email.indexOf("@");
                 for(int i=a;i<temp;i++){
            if(email.charAt(i)=='.'){
            flag3=true; 
            count=count+1;
            }
            }
            if(count<1||count>2){
            flag4=false;
            }
            else{
            flag4=true;
            }
            }
            else{
            flag2 =false;
            System.out.println("No @ symbol present");
            }
    
    
        //Condition 3
        if(email.matches("[A-Z a-z _]+@.*")) //Unable to get the right RegEx here!
            flag5 = true;
        else
            flag5 = false;
    
        //Condition4
        if(Character.isUpperCase(email.charAt(0))==true)
                flag6 = true;
        else
            flag6=false;
    
        if(flag1==true && flag2==true && flag3==true && flag4==true && flag5==true &&flag6==true)
            System.out.println("Email ID is valid");
        else{
            if(flag1==false)
                System.out.println("Inavlid length of Email ID");
            if(flag2==false||flag3==false||flag4==false)
                System.out.println("Invalid Position of Special Characters");
            if(flag5==false)
                System.out.println("Invalid combination for username");
            if(flag6==false)
                System.out.println("Invalid case of first letter");
        }
    
    
    }
    }
    

    I'm not sure of the condition #2(the logic?) and condition #3(the RegExp part). A few of the test cases seem correct, the rest of them are wrong(owing to faulty logic in #2 and esp #3, I think.)

    Please, tell me what changes have to be done here to get the right output. Thanks!

    • SLaks
      SLaks almost 11 years
      Every one of your validation rules is wrong. Don't do this.
    • Maroun
      Maroun almost 11 years
      Side note: if((length>3 && length<20)== true) should be if(length>3 && length<20)
    • user2377778
      user2377778 almost 11 years
      @Slaks Can you please suggest what I should improve on?
    • Kyle
      Kyle almost 11 years
      Wrong is subjective. That could be right under certain circumstances. Sounds like class work though
    • SLaks
      SLaks almost 11 years
      Get rid of them all. The rules for valid email addresses are extremely complicated; you should use commons.apache.org/proper/commons-validator/apidocs/org/apac‌​he/…
    • Brian Roach
      Brian Roach almost 11 years
    • SLaks
      SLaks almost 11 years
      @Kyle: I can't think of any sane circumstances in which any of the rules would be right.
    • user2377778
      user2377778 almost 11 years
      @SLaks :( Oh! I will look into it. I'm just a beginner at Java, coding this for a java 101 class, so we've been provided with a few rules to get the grip of programming, that's all.
    • user2377778
      user2377778 almost 11 years
      @Kyle : Yes, this is classwork. Basics of Java Programming.
    • aran
      aran almost 11 years
      this code is so wrong my JVM is crying
    • Kyle
      Kyle almost 11 years
      [A-Z][a-zA-Z_]*(?<=_)(?<=[A-Z])(?<=[a-z])@.{1,2}(?<=.{4,19}) ill throw out a one liner.
    • user2377778
      user2377778 almost 11 years
      @Kyle All the 4 conditions need not be in the same reg-expression. Just the RegExp for Condition #3 would suffice.
  • user2377778
    user2377778 almost 11 years
    Thank you so much @thegrinner
  • Joseph
    Joseph about 8 years
    Maybe you could update your answer with the last example from here howtodoinjava.com/regex/java-regex-validate-email-address otherwise good explanation you gave there.