简体   繁体   English

正则表达式与荷兰电话号码

[英]Regex with dutch phone numbers

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 该正则表达式非常适合普通数字,例如: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. 但是,我需要添加服务编号,例如“ 112”,“ 0800-1234”,但“ 0909-12345678”必须无效,因为它太长了。 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. 编辑:它应该在Java中。

I once wrote a phonenumber regex in python that matches international phone numbers but has special support for Dutch phone numbers. 我曾经用python编写了一个电话号码正则表达式,该电话号码与国际电话号码匹配,但对荷兰电话号码有特殊支持。 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. 如果要运行此代码段,请注意,此函数使用您应安装的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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM