一道比较简单的面试题,但做得很糟

/*
 * 面试题:判断一个email字符串的格式是否正确,不能使用正则表达式,用标准的程序流程图写出来 

*/

 

当时都email的格式都不太了解,回查了下才知道大概,重新做了下不知道还有没有更好的方法

 

public class EmailFormat {

 public static void main(String[] argsd) {
  System.out.println(isEmail("Johosf@fdsf@fdfs.com"));
 }
 
 public static boolean isEmail(String emailStr) {
  //判断字符串是否以下面字符结尾
  if(emailStr.endsWith(".com")|| emailStr.endsWith(".com.cn") 
         || emailStr.endsWith("educ.cn")
         || emailStr.endsWith(".net")
         || emailStr.endsWith(".gov.cn") 
         || emailStr.endsWith(".org.cn")
         ) {
   //截取"."之前的字符串
   emailStr = emailStr.substring(0, emailStr.indexOf('.'));
   
   //以“@”分割字符串
   String[] strs = emailStr.split("@");
   //判断是否只有一个“@”,也就是数组判断数组长度是否等于2
   if(strs.length ==2 ) {
    for(String str : strs) {
     //判断字符串是否以"_"开始,是就直接返回false
     if(str.startsWith("_")) {
      return false;
     }
     
    }
    for(char c : strs[0].toCharArray()) {
     //判断字符串里的每个字符是否都属于1-9,a-z,A-Z,或者"-",如果不是就是直接返回false
     if(!((c>=65&&c<=90) 
       || (c>=95&&c<=122) 
       || c=='_')) {
      return false;
     }
    }
    return true;
   }
   
  }
  return false;
 }

}

 

 


问题补充:
public static void main(String[] argsd) {
System.out.println(isEmail("joso.hoo@fdsaf-fdfs.com"));
}
public static boolean isEmail(String emailStr) {
    if(!emailStr.contains("@")) {return false;}

    //判断字符串是否以下面字符结尾,是就去掉它,如果都不是就返回false
    if(emailStr.endsWith(".com")) {
        emailStr = emailStr.substring(0, emailStr.indexOf(".com"));
    } else if(emailStr.endsWith(".com.cn")) {
        emailStr = emailStr.substring(0, emailStr.indexOf(".com.cn"));
    } else if(emailStr.endsWith(".edu.cn")) {
        emailStr = emailStr.substring(0, emailStr.indexOf(".edu.cn"));
    } else if(emailStr.endsWith(".net")){
        emailStr = emailStr.substring(0, emailStr.indexOf(".net"));
    } else if(emailStr.endsWith(".gov.cn")){
        emailStr = emailStr.substring(0, emailStr.indexOf(".gov.cn"));
    } else if(emailStr.endsWith(".org.cn")){
        emailStr = emailStr.substring(0, emailStr.indexOf(".org.cn"));
    } else {
        return false;
    }

        //以“@”分割字符串
        String[] strs = emailStr.split("@");
        //判断是否只有一个“@”,也就是数组判断数组长度是否等于2
        if(!(strs.length ==2) ) { 
            return false; 
        } else if(strs[0].charAt(0) == '-' || strs[0].charAt(0) == '_' || strs[0].charAt(0) == '.'
                || strs[1].charAt(0) == '-' || strs[1].charAt(0) == '_' || strs[1].charAt(0) == '.') {
            return false;
        } else {
            //判断字符串里的每个字符是否都属于1-9,a-z,A-Z,或者"_" "-" ".",如果不是就是直接返回false
            for(char c : strs[0].toCharArray()) {
                if(!((c&gt;=65&amp;&amp;c&lt;=90) || (c&gt;=95&amp;&amp;c&lt;=122) || c=='_' || c=='-' || c=='.')) {
                    return false;
                }
            }
            //判断字符串里的每个字符是否都属于1-9,a-z,A-Z,或者"-" ,如果不是就是直接返回false
            for(char c : strs[1].toCharArray()) {
                if(!((c&gt;=65&amp;&amp;c&lt;=90) || (c&gt;=95&amp;&amp;c&lt;=122) ||c=='-')) {
                    return false;
                }
            }

            return true;
        }


    }</pre><br /><strong>问题补充:</strong><br /><span style="color: red">以上改进了一下,大家看一下还有没有问题,当时手写这道笔试题真是痛苦</span><br /><strong>问题补充:</strong><br />域名真多,不想再谈域名细节的问题,只是想知道这样做的思路对不对?

这一段还是有些问题
-- for(char c : strs[1].toCharArray()) {

-- if(!((c>=65&&c<=90) || (c>=95&&c<=122) ||c=='-')) {

-- return false;

-- }

-- }

我们以前学校的邮箱yy@stud.aiai.edu.cn居然测试通不过.....
还有比如xx@vip.163.com

优化方案

1.你应该最先判断字符串中是否有"@",如果没有就直接返回false了

你这个判断有问题啊
-- //截取"."之前的字符串

-- emailStr = emailStr.substring(0, emailStr.indexOf('.'));

比如example.2009@qq.com就不能通过你的验证,但是他是合法的email地址