2014-01-07 5 views
2

Мне нужно создать регулярное выражение для голландских телефонных номеров. То, что я получил до сих пор:Regex с голландскими номерами телефонов

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

Это регулярное выражение прекрасно работает для нормальных чисел, таких как: 020-5951611

Однако мне нужно добавить служебные номера, такие как «112», «0800-1234», но " 0909-12345678 "должен быть недействительным, потому что он слишком длинный. У меня есть файл с большим количеством тестовых примеров (здесь), если есть истина, номер должен быть действительным, если он неверен, номер недействителен.

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"); 

Я надеюсь, что кто-то может помочь мне в этом, спасибо заранее!

Редактировать: Он должен быть на Java.

+1

Подтверждение формы номера телефона с регулярным выражением разделяет те же ошибки, что и проверка электронной почты с регулярным выражением. Можете ли вы все поймать? Стоит ли оно того? Что вы пытаетесь проверить - существующие числа или номер, который пользователь намеревался? Если последний, рассмотрите ввод «подтвердить номер». Неужели возникает проблема, с которой пользователи часто сталкиваются? Будет ли более полезной процедура проверки? – Gusdor

+0

Другой подобный вопрос был [задан до] (http://stackoverflow.com/questions/17949757/regular-expression-for-dutch-phone-number). Попробуйте решения там и посмотрите, удовлетворяет ли оно вашим потребностям. В другой заметке вам не нужно скрывать '+' в символьном классе, так как он потеряет смысл, поместите '-' в конец класса символов и не сформирует диапазон, который означает, что он также теряет имея в виду. Поздравляем, вы просто сохранили 4 байта и боль в глазах '[0-9 + -] {8,14}' – HamZa

+2

Не могли бы вы поместить английские комментарии в свой фрагмент кода, пожалуйста? – Jerry

ответ

3

Я как-то написал регулярное выражение phonenumber в python, которое соответствует международным телефонным номерам, но имеет специальную поддержку для голландских телефонных номеров. Возможно, это может помочь вам создать собственное регулярное выражение.

Если вы хотите запустить этот фрагмент, обратите внимание, что эта функция использует модуль 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

Я думаю, что пользователь использует Java. – Jerry

+0

Я думаю, что этот вопрос скорее о регулярном выражении, чем в языке;) – rednaw

+0

Ну, я думаю, если пользователь понимает, как строки обрабатываются в python. Например, размещение [здесь] (http://regex101.com/r/lS3pL0) не работает для номеров примеров. – Jerry

Смежные вопросы