Java程序 - 使用Strings和RegEx进行电子邮件地址验证

时间:2013-05-13 14:07:59

标签: java regex string

问题陈述是这样的:

我们需要创建一个名为 emailId

的String数据类型

必须使用适当的setter方法设置电子邮件ID。

电子邮件ID检查的验证规则必须在main()中实现。

条件是:

  1. 电子邮件ID的总长度必须为&gt; 3且<20。

  2. emailId必须包含“@”后跟最少1个,最多2个“。”字符。

  3. “@”之前的子字符串必须包含大写字母,小写字母和“_”(下划线)符号的组合。

  4. 电子邮件ID的第一个字母必须为大写字母。

  5. 如果以上所有条件都有效,则应显示“电子邮件ID有效”,否则应显示相应的错误消息

    这是我的代码:

    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("CFDV@gm.a.il.com");
        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");
        }
    
    
    }
    }
    

    我不确定条件#2(逻辑?)和条件#3(RegExp部分)。一些测试用例似乎是正确的,其余的都是错误的(由于#2和esp#3中的错误逻辑,我认为。)

    请告诉我,为了获得正确的输出,必须在此处进行哪些更改。 谢谢!

2 个答案:

答案 0 :(得分:4)

如果你坚持使用正则表达式,你可以使用它但没有正确验证你可能遇到各种麻烦

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();

}

或者您可以使用

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

哪个核心java实用程序会更好......

请注意,这些都不会保证一个地址实际上是有效的,只是它是正确形成的,所以假设可能存在

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

将检查您可以与

组合的最后三个约束
string.length()>3 && string.length()<20

答案 1 :(得分:0)

  

电子邮件ID的总长度必须为&gt; 3且<20。

你有这个部分很好 - 一对长度检查。需要考虑的事项:

  1. 您不需要if (condition == true),只需if (condition)
  2. 如果失败,您可以停止处理电子邮件,只显示错误。这同样适用于您的所有其他错误情况。
  3.   

    emailId必须包含“@”,后跟最少1个,最多2个“。”字符。

    首先检查@符号并获取索引。完成后,您可以拆分字符串。然后,您可以在句点上拆分子字符串并计算它们 - 您需要两个或三个。

    可能还有一个正则表达式也会这样做。

      

    “@”之前的子字符串必须包含大写,小写和“_”(下划线)符号的组合。

    您可以使用this approach确保正则表达式必须与每个部分匹配。就目前而言,我相信如果有大写字母,小写字母,下划线而不是检查所有三个字符串,那么正则表达式将会起作用。

      

    电子邮件ID的第一个字母必须是大写字母。

    与第一部分相同的评论,删除== true并在方法失败时将其短路。