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

时间:2010-04-21 15:59:18

标签: 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 个答案:

答案 0 :(得分:3)

如果这不是作业,你有没有理由避免使用正则表达式?

以下是一些有用的内容:http://regexlib.com/DisplayPatterns.aspx?cattabindex=6&categoryId=7

更一般地说,您的代码似乎没有验证您有电话号码,它似乎只是验证您的字符串只包含数字。你现在也不允许任何特殊字符。

答案 1 :(得分:1)

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

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

你的逻辑很奇怪;你甚至没有引用设置的特殊字符集,一旦找到匹配字符就会出现循环逻辑。我想这是你的错误;匹配似乎是错误的方法,如果字符匹配第一个有效字符,你将标志设置为false并继续循环当前循环;所以它绝对不会匹配下一个有效的char,因此你会用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 :(得分:1)

也许这有点矫枉过正,但语法类似于:

<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

答案 3 :(得分:0)

您可以在Java中签出Pattern类,使用此类非常容易使用正则表达式: http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html