2014-01-07 2 views
2

네덜란드 전화 번호 용 정규식을 만들어야합니다. 나는 지금까지 무엇을 가지고 : 정규식과 같은 일반 번호에 대해 완벽하게 작동네덜란드어 전화 번호를 사용하는 정규식

[0-9\\-\\+]{8,14} 

: 나는 "예 :"112 ","0800-1234 "하지만 같은 서비스 번호를 추가해야하지만 020-5951611

0909-12345678 "은 너무 길기 때문에 무효해야합니다. 많은 테스트 사례가있는 파일이 있는데 (여기 아래에 있음), 숫자가 유효하면 true이고, 숫자가 유효하지 않으면 false입니다.

System.err.println("running checkNummer"); 
    TelefoonNummerChecker instance = new TelefoonNummerChecker(); 
    assertEquals(true, instance.checkNummer("020-5951611")); 
    assertEquals(true, instance.checkNummer("0205951611")); 
    assertEquals(true, instance.checkNummer("+31205951611")); 
    assertEquals(true, instance.checkNummer("+3120-5951611")); 
    assertEquals(true, instance.checkNummer("+31612345678")); 
    assertEquals(true, instance.checkNummer("+316-12345678")); 
    assertEquals(true, instance.checkNummer("06-12345678")); 
    assertEquals(true, instance.checkNummer("0612345678")); 
    assertEquals(true, instance.checkNummer("0031612345678")); 
    assertEquals(true, instance.checkNummer("00316-12345678")); 
    assertEquals(true, instance.checkNummer("0234-123456")); 
    assertEquals(true, instance.checkNummer("0234123456")); 
    assertEquals(true, instance.checkNummer("+31234-123456")); 
    assertEquals(true, instance.checkNummer("+31234123456")); 
    assertEquals(true, instance.checkNummer("+3132")); // lelystad 0320 
    assertEquals(true, instance.checkNummer("003132")); 
    assertEquals(true, instance.checkNummer("0031320-123456")); 
    assertEquals(true, instance.checkNummer("0320-123456")); 
    // korte service nummers: 
    assertEquals(true, instance.checkNummer("112")); 
    assertEquals(true, instance.checkNummer("0800-1234")); 
    assertEquals(false, instance.checkNummer("0909-12345678")); // too long 
    assertEquals(true, instance.checkNummer("090")); 
    assertEquals(true, instance.checkNummer("08009876")); 
    assertEquals(false, instance.checkNummer("0808-123456")); 
    assertEquals(false, instance.checkNummer("+32205951611")); // not valid in NL 
    assertEquals(false, instance.checkNummer("+3220-5951611")); // not valid in NL 
    assertEquals(false, instance.checkNummer("02-05951611")); // before dash should be 3 or 4 long 
    assertEquals(false, instance.checkNummer("02-15951611")); // before dash should be 3 or 4 long 
    assertEquals(false, instance.checkNummer("0-215951611")); // before dash should be 3 or 4 long 
    assertEquals(false, instance.checkNummer("02059-51611")); // before dash should be 3 or 4 long 
    assertEquals(false, instance.checkNummer("0034-1234567")); // before dash may not have 2x a 0 
    assertEquals(false, instance.checkNummer("0200951611")); // may not start with 0 
    assertEquals(false, instance.checkNummer("02059516229")); // too long 
    assertEquals(false, instance.checkNummer("020595162")); // too short 
    assertEquals(false, instance.checkNummer("020-0234567")); // may not start with 0 
    assertEquals(false, instance.checkNummer("123456789")); // no 10 numbers 
    assertEquals(false, instance.checkNummer("1234567890")); // net number doesn't start with 0 
    assertEquals(false, instance.checkNummer("123-5951619")); // net number doesn't start with 0 
    assertEquals(false, instance.checkNummer("0320-")); // abo starts with zero 

    assertEquals(false, instance.checkNummer("+31-205951611")); // no dash before abon number 
    assertEquals(false, instance.checkNummer("+31-2-05951611")); // no 2x - 
    assertEquals(false, instance.checkNummer("+31-2-0-5951611")); // no 2x - 
    assertEquals(false, instance.checkNummer("+31-2-0-595161-1")); // no 2x - 
    assertEquals(false, instance.checkNummer("06-1-2345678")); // no 2x - 
    assertEquals(false, instance.checkNummer("020-59-51611")); // no 2x - 
    assertEquals(false, instance.checkNummer("020-5-9-51611")); // no 2x - 
    assertEquals(false, instance.checkNummer("0205951-611")); // too long 
    assertEquals(false, instance.checkNummer("06-1-2345678")); // no 2x - 
    assertEquals(false, instance.checkNummer("0045106539985")); // not dutch 
    assertEquals(false, instance.checkNummer("0031476534")); // 0031, not enough numbers next to 0031 
    assertEquals(false, instance.checkNummer("+310612345678")); // 06 must be 6 
    assertEquals(false, instance.checkNummer("00310205951688")); // 020 must be 20 
    System.err.println("end test checkNummer"); 

누군가가 이것을 도와 줄 수 있기를 바랍니다. 미리 감사드립니다.

편집 : 자바로 작성해야합니다.

+1

정규식을 사용하여 전화 번호 양식을 확인하는 것은 정규식을 사용하여 이메일을 확인하는 것과 동일한 함정을 공유합니다. 모든 걸 잡을 수 있니? 그만한 가치가 있니? 기존 번호 또는 사용자가 의도 한 번호를 검증하려고합니다. 후자의 경우 '번호 확인'입력을 고려하십시오. 사용자가 자주 경험하는 문제가 해결되지 않습니까? 검증 절차가 더 유용할까요? – Gusdor

+0

또 다른 비슷한 질문이 [이전에 요청되었습니다] (http://stackoverflow.com/questions/17949757/regular-expression-for-dutch-phone-number). 거기서 해결책을 시도하고 그것이 당신의 필요를 충족시키는 지보십시오. 또 다른 메모에서는, 문자 클래스에서'+'를 벗어날 필요가 없습니다. 왜냐하면 문자 클래스의 끝 부분에'-'를 넣으면 의미를 잃을 것이고 범위를 만들지 않을 것입니다. 의미. 축하합니다. 방금 4 바이트와 고통을 눈에 저장했습니다. [0-9 + -] {8,14}' – HamZa

+2

영어 코드를 코드 스 니펫에 넣어 주시겠습니까? – Jerry

답변

3

필자는 국제 전화 번호와 일치하는 파이썬 넘버 정규 표현식을 작성했지만 네덜란드 전화 번호를 특별히 지원합니다. 어쩌면이게 당신이 자신의 정규식을 만드는 데 도움이 될 수 있습니다.

이 스 니펫을 실행하려면이 기능을 사용하기 위해 설치해야하는 python regex 모듈을 사용합니다.

import regex 


def phone_regex(): 
    """ 
    Matches phone numbers with formatting like spaces, parentheses and 
    dashes. 

    Has special checkig for dutch phone numbers, but supports international 
    phone numbers too. 

    more info: 
    https://en.wikipedia.org/wiki/List_of_international_call_prefixes 
    https://nl.wikipedia.org/wiki/Telefoonnummer 
    https://nl.wikipedia.org/wiki/Informatienummer 
    """ 

    # a number with possibly a dash prepended 
    num_dash = '(?:-\s*)?[0-9]\s*' 

    return regex.compile(r''' 
     ^(?: 

     \s* 

      # Dutch phone number: 

       (?: 

        #regular numbers: 

         (?: 
          # a zero followed by a a nonzero number 
          0\s*[1-9]\s* 
          (?:''' + num_dash + '''){8} 
         | 
          # 3 digit area code in parentheses 
          \(0\s*[1-9]\s*[0-9]\s*\)\s* 
          (?:''' + num_dash + '''){7} 
         | 
          # 4 digit area code in parentheses 
          \(0\s*[1-9]\s*(?:[0-9]\s*){2}\)\s* 
          (?:''' + num_dash + '''){6} 
         ) 

       | 

        # infonumbers: 

         (?: 
          # 0900 number 
          0\s*9\s*0\s*0\s* 
         | 
          # 0800 number 
          0\s*8\s*0\s*0\s* 
         | 
          # 0906 number 
          0\s*9\s*0\s*6\s* 
         | 
          # 0909 number 
          0\s*9\s*0\s*9\s* 
         ) 
         (?:''' + num_dash + '''){4,7} 

       | 

        # 112 alarm number 
        1\s*1\s*2\s* 

       ) 

     | 

      # International phone number: 

       # plus sign, to indicate international phone number 
       \+\s* 
       # the country code, can be 1 to 4 characters 
       (?:[0-9]\s*){1,4} 

       # area code, can be a number from 1 to 4 digits 
       (?: 
        # area code in parentheses 
        \((?:[0-9]\s*){1,4}\)\s* 
       | 
        # area code without parentheses 
        (?:[0-9]\s*){1,4} 
       ) 

       # local number 
       (?:''' + num_dash + '''){5,9} 

     )$''', regex.X) 
+1

나는 사용자가 비록 자바를 사용하고 있다고 생각한다. – Jerry

+0

이 질문은 언어보다 정규식에 관한 것 같아요;) – rednaw

+0

사용자가 문자열을 파이썬으로 처리하는 방법을 이해한다면 글쎄요. 비록 여기에 넣어 (http://regex101.com/r/lS3pL0) 샘플 번호를 위해 작동하지 않는 것. – Jerry

관련 문제