Регулярное выражение с голландскими номерами телефонов


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

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

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

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

    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("+31320123456")); // lelystad 0320
    assertEquals(true, instance.checkNummer("0031320123456"));
    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("09001234")); 
    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-012345")); // 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");

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

Edit: он должен быть на Java.

1   2  

1 ответ:

Однажды я написал регулярное выражение 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)