有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中验证电话号码(美国格式)?

我只想知道我错在哪里:

import java.io.*;


    class Tokens{   
            public static void main(String[] args)
            {
               //String[] result = "this is a test".split("");

                String[] result = "4543 6546 6556".split("");
                boolean flag= true;         

                String num[] = {"0","1","2","3","4","5","6","7","8","9"};
                String specialChars[] = {"-","@","#","*"," "};


                for (int x=1; x<result.length; x++)
                {   
                    for (int y=0; y<num.length; y++)
                    {
                        if ((result[x].equals(num[y])))
                        {
                            flag = false;
                            continue;

                        }
                        else
                        {
                            flag = true;
                        }


                        if (flag == true)
                        break;

                    }   

                if (flag == false)
                break;

                }           

                System.out.println(flag);

            }

    }

共 (4) 个答案

  1. # 1 楼答案

    除了正则表达式的建议(这是一个很好的建议),处理字符数组似乎比处理单个字符字符串更有意义

    特别是split("")调用(抖动)可以/应该被toCharArray()替换。这使您可以迭代每个单独的字符,这更清楚地表明您的意图,因为您知道您正在同时处理每个字符,所以不太容易出现错误,而且效率更高*。同样,您的有效字符集也应该是字符

    你的逻辑表达得很奇怪;您甚至根本没有引用specialChars集合,并且一旦找到匹配项,循环逻辑似乎很奇怪。我想这是你的错误;匹配似乎是错误的循环方式,因为如果字符与第一个有效字符匹配,则将flag设置为false,并继续循环当前循环;因此,它肯定与下一个有效字符不匹配,因此使用true标志中断循环。总是

    我本以为这样会更直观:

    private static final Set<Character> VALID_CHARS = ...;
    
    public boolean isValidPhoneNumber(String number)
    {
        for (char c : number,toCharArray())
        {
            if (!VALID_CHARS.contains(c))
            {
               return false;
            }
        }
    
        // All characters were valid
        return true;
    }
    

    这不考虑序列(例如字符串“----------**”和“1”将是有效的,因为所有单个字符都是有效的),但原始代码也不考虑序列。正则表达式更好,因为它允许您指定模式,我提供上面的代码片段作为一个更清晰的字符迭代方法的示例

    *是的,过早优化是万恶之源,但当更好时,更干净的代码也恰好更快,这是免费的额外胜利

  2. # 2 楼答案

    如果这不是家庭作业,你为什么要避免使用正则表达式

    这里有一些有用的:http://regexlib.com/DisplayPatterns.aspx?cattabindex=6&categoryId=7

    更一般地说,您的代码似乎并没有验证您是否有电话号码,它似乎只是验证您的字符串仅由数字组成。你现在也不允许任何特殊角色

  3. # 4 楼答案

    也许这有点过分,但语法类似于:

    <phone_numer> := <area_code><space>*<local_code><space>*<number> |
                     <area_code><space>*"-"<space>*<local_code><space>*"-"<space>*<number>
    <area_code>   := <digit><digit><digit> | 
                     "("<digit><digit><digit>")"
    <local_code>  := <digit><digit><digit>
    <number>      := <digit><digit><digit><digit>
    

    您可以编写递归下降解析器。有关示例,请参见this page