首页 > 解决方案 > 使用 Java 验证电话号码

问题描述

所以我正在创建一个 Java 程序来验证用户是否输入了有效的电话号码。我character array用来存储电话号码。我相信我在 for 循环中的 Switch/Cases 设置会导致逻辑错误并打印出电话号码无效,尽管它是有效的。

当我遍历数组时,我正在搜索字符匹配;如果未找到匹配项,则它不是valid phone number.

 for(int k =0; k < phoneNumArray.length; k++)
 {
 /* If 
/* Switch Case used to validae each array element*/
  switch(k)
  {
   case 0:
      if(phoneNumArray[0] != '(')
      {
       System.out.println("MISSING LEFT PARENTHESIS NOT A PHONE NUMBER");
       right_num = false;
      }break;
  case 1:
      if(phoneNumArray[1] == '0' || !(phoneNumArray[1]<= '1' || phoneNumArray[1]>= '9') || (phoneNumArray[1] >= 'A' || phoneNumArray[1] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;

   case 2:
      if(!(phoneNumArray[2] >= 0 || phoneNumArray[2] <= 9) || (phoneNumArray[2] >= 'A' || phoneNumArray[2] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;
    case 3:
      if(!(phoneNumArray[3] >= 0 || phoneNumArray[3] <= 9) || (phoneNumArray[3] >= 'A' || phoneNumArray[3] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
       break;
      };
   case 4:
      if(phoneNumArray[4] != ')')
   {
    System.out.println("MISSING RIGHT PARENTHESIS NOT A PHONE NUMBER");
    right_num = false;
    break;
   };
   case 5:
      if(!(phoneNumArray[5] >= 0 || phoneNumArray[5] <= 9) || (phoneNumArray[5] >= 'A' || phoneNumArray[5] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;
   case 6:
      if(!(phoneNumArray[6] >= 0 || phoneNumArray[6] <= 9) || (phoneNumArray[6] >= 'A' || phoneNumArray[6] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;
   case 7:
      if(!(phoneNumArray[7] >= 0 || phoneNumArray[7] <= 9) || (phoneNumArray[7] >= 'A' || phoneNumArray[7] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;
   case 8:
      if(phoneNumArray[8] != '-')
   {
    System.out.println("MISSING A DASH NOT A PHONE NUMBER");
    right_num = false;
   }break;
   case 9:
      if(!(phoneNumArray[9] >= 0 || phoneNumArray[9] <= 9) || (phoneNumArray[9] >= 'A' || phoneNumArray[9] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;
   case 10:
      if(!(phoneNumArray[10] >= 0 || phoneNumArray[10] <= 9) || (phoneNumArray[10] >= 'A' || phoneNumArray[10] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;
   case 11:
      if(!(phoneNumArray[11] >= 0 || phoneNumArray[11] <= 9) || (phoneNumArray[11] >= 'A' || phoneNumArray[11] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;
   case 12:
      if(!(phoneNumArray[12] >= 0 || phoneNumArray[12] <= 9) || (phoneNumArray[12] >= 'A' || phoneNumArray[12] <= 'z') )
      {
       System.out.println("MISSING VALID INTEGER");
       right_num = false;
      }break;

标签: javaarraysswitch-statement

解决方案


注意:1问题中对案例的期望不明确

  1. 除非性能非常重要,否则最好编写正则表达式而不是尝试构建状态机进行验证(尽可能)
  2. 状态机将很难跟进并且需要更多代码
  3. 没有look head的普通正则表达式很容易理解
        String pattern = "^\\([1-9A-Za-z][0-9A-Za-z]{2}\\)[0-9A-Za-z]{3}-[0-9A-Za-z]{4}$";
        Pattern phoneNumber = Pattern.compile(pattern);
        System.out.println(phoneNumber.matcher("(000)000-0000").matches());
        System.out.println(phoneNumber.matcher("(100)000-0000").matches());

如果要求是使用 switch case,那么

  1. 将相似的状态统一到一个组中
  2. 为这些独特的组编写代码
        char[] phoneNumArray = "(100)000-0000".toCharArray();
        boolean right_num = true;
        for (int k = 0; k < phoneNumArray.length && right_num; k++) {
            final char current = Character.toUpperCase(phoneNumArray[k]);
            switch (k) {
                case 0:
                    if (current != '(') {
                        System.out.println("MISSING LEFT PARENTHESIS NOT A PHONE NUMBER");
                        right_num = false;
                    }
                    break;
                case 1:
                    if (current == '0' || !((current >= '1' && current <= '9') || (current >= 'A' && current <= 'Z'))) {
                        System.out.println("MISSING VALID INTEGER");
                        right_num = false;
                    }
                    break;

                case 2:
                case 3:
                case 5:
                case 6:
                case 7:
                case 9:
                case 10:
                case 11:
                case 12:
                    if (!((current >= '0' && current <= '9') || (current >= 'A' && current <= 'Z'))) {
                        System.out.println("MISSING VALID INTEGER");
                        right_num = false;
                    }
                    break;

                case 4:
                    if (current != ')') {
                        System.out.println("MISSING RIGHT PARENTHESIS NOT A PHONE NUMBER");
                        right_num = false;
                    }
                    break;
                case 8:
                    if (current != '-') {
                        System.out.println("MISSING A DASH NOT A PHONE NUMBER");
                        right_num = false;
                    }
                    break;
            }
        }
        System.out.println(right_num);


推荐阅读