Question

I need to create a regex for dutch phone numbers. What I got so far:

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

That regex works perfectly for normal numbers such as: 020-5951611

However I need to add service numbers such as "112", "0800-1234" but "0909-12345678" has to be invalid because it's too long. I've got a file with a lot of test cases (down here), if there's true the number should be valid, if it's false the number is not valid.

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

I hope someone could help me with this, thanks in advance!

Edit: It should be in Java.

Was it helpful?

Solution

I once wrote a phonenumber regex in python that matches international phone numbers but has special support for Dutch phone numbers. Maybe this can help you create your own regex.

If you want to run this snippet, note that this function uses the python regex module that you should install in order to use it.

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)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top