【问题标题】:Java Program - Email address verification using Strings and RegExJava 程序 - 使用字符串和 RegEx 验证电子邮件地址
【发布时间】:2013-05-13 14:07:59
【问题描述】:

问题陈述是这样的:

我们需要创建一个名为emailId

的String数据类型

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

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

条件是:

  1. 电子邮件 ID 的总长度必须 >3 且

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

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

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

如果上述所有条件都有效,则应显示“Email 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 中的逻辑错误。)

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

【问题讨论】:

  • 你的每一条验证规则都是错误的。不要这样做。
  • 旁注:if((length&gt;3 &amp;&amp; length&lt;20)== true) 应该是 if(length&gt;3 &amp;&amp; length&lt;20)
  • @Slaks 你能建议我应该改进什么吗?
  • 摆脱它们。有效电子邮件地址的规则极其复杂;你应该使用commons.apache.org/proper/commons-validator/apidocs/org/apache/…
  • @Kyle:我想不出在任何正常情况下任何规则都是正确的。

标签: java regex string


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

电子邮件 ID 的总长度必须 >3 且

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

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

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

首先检查@符号并获取索引。一旦你有了它,你就可以拆分字符串。然后,您可以在句点上拆分子字符串并计算它们 - 您想要两个或三个。

可能有一个正则表达式也可以做到这一点。

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

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

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

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

【讨论】:

  • 非常感谢@thegrinner
猜你喜欢
  • 2011-10-28
  • 2021-05-02
  • 2019-09-17
  • 1970-01-01
  • 2011-11-02
  • 2012-10-16
  • 2014-06-12
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多