2010-04-21 3 views
1

나는 어디서 잘못 내가 여기 알고 싶어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); 

      } 

    } 
+0

* 3..2..1에서 "regexp"* 대답을 사용하고 * "문제가 생겼을 때 정규 표현식을 사용하면 이제는 두 가지 문제가 있습니다."* 3..2..1;) – SyntaxT3rr0r

+0

@WizardOfOdds : 당신이 늦었습니다. "regexp를 사용하십시오"라는 대답은 * 귀하의 코멘트 앞에 있습니다 .-) –

답변

1

잡담 단일 문자 스트링이 아닌 문자의 배열을 처리해야합니다.

특히, split("") 전화 (떨림)는 toCharArray()으로 바꿔야합니다. 이렇게하면 각각의 캐릭터를 반복 할 수있게됩니다. 의도를 더 분명하게 나타내며, 을 알고 있으므로 한 번에 각 캐릭터를 처리하므로 더 효율적입니다. 마찬가지로 유효한 문자 집합도 문자 여야합니다.

논리가 이상하게 표현됩니다. 당신은 specialChars를 전혀 참조하지 않고 있으며, 일단 일치를 발견하면 루핑 로직은 이상하게 보입니다. 나는 이것이 당신의 버그라고 생각합니다. 문자가 첫 번째 유효한 문자와 일치하는 경우 일치가 잘못된 방법 인 것 같습니다. 플래그를 false으로 설정하고 현재 루프를 계속 라운드합니다. 그래서 그것은 다음 유효 문자와 정확히 일치하지 않을 것이고 따라서 당신은 true 플래그로 루프에서 빠져 나옵니다. 항상.

I는 다음과 같이보다 직관적 것이라고 생각했을 것이다 : 이것은 "1 계정에 시퀀스 (예를 들어 문자열"-------- ** "를 타고하지 않습니다

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; 
} 

"모든 개별 문자가 유효하기 때문에 유효 할 것입니다.) 그러나 원래 코드는 마찬가지입니다. 정규식은 패턴을 지정할 수 있기 때문에 더 좋습니다. 위의 코드 조각을 문자를 반복하는 명확한 방법의 예로서 제공합니다.

은 * 예, 조기 최적화는 모든 악의 근원이지만, 청소기 코드도 빠르게 될 일 때 무료로 여분의 승리입니다.

3

를이하지 숙제 경우 정규 표현식을 피할 수있는 이유가 무엇입니까? 단지 당신의 문자열이 숫자로만 구성되어 있음을 확인하는 것, http://regexlib.com/DisplayPatterns.aspx?cattabindex=6&categoryId=7

가 더 일반적으로, 코드가 전화 번호를 가지고 있음을 확인하지 않는 것 :

여기에 몇 가지 유용한 것들입니다. 현재 특수 문자를 허용하지 않습니다.

+0

이것은 단지 연습을위한 것입니다. 검증을위한 최선의 방법을 제안하십시오. –

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을 참조하십시오.

관련 문제