【问题标题】:Regexp for german phone number format德国电话号码格式的正则表达式
【发布时间】:2017-05-23 03:46:52
【问题描述】:

我尝试从德语格式的字符串中获取电话号码。但我没有让它完全运行。输入文本是一个包含大量内容的完整 HTML 页面,而不仅仅是数字。

可能的格式:

(06442) 3933023     
(02852) 5996-0       
(042) 1818 87 9919   
06442 / 3893023  
06442 / 38 93 02 3     
06442/3839023
042/ 88 17 890 0     
+49 221 549144 – 79  
+49 221 - 542194 79  
+49 (221) - 542944 79
0 52 22 - 9 50 93 10 
+49(0)121-79536 - 77 
+49(0)2221-39938-113 
+49 (0) 1739 906-44  
+49 (173) 1799 806-44
0173173990644
0214154914479
02141 54 91 44 79
01517953677
+491517953677
015777953677
02162 - 54 91 44 79
(02162) 54 91 44 79

我试过了:

$regex =  '~(?:\+?49|0)(?:\s*\d{3}){2}\s*\d{4,10}~';
if(preg_match_all($regex, $input_imprint , $matches)){
    print_r($matches);
}

但它不仅仅匹配少数几种格式。我不知道该怎么做。

【问题讨论】:

    标签: java php regex preg-match preg-match-all


    【解决方案1】:

    这是一个匹配所有格式的正则表达式。 我建议然后替换所有不需要的字符,然后你就得到了你想要的结果。

    (\(?([\d \-\)\–\+\/\(]+)\)?([ .\-–\/]?)([\d]+))
    

    如果您需要最小长度来匹配您的号码,请使用:

    (\(?([\d \-\)\–\+\/\(]+){6,}\)?([ .\-–\/]?)([\d]+))
    

    https://regex101.com/r/CAVex8/143

    已更新,感谢@Willi Mentzel 的建议

    【讨论】:

    • 第二个减号将被解释为“直到”。您应该将其遮盖以避免不必要的匹配。 (\(?([\d \-\)\–\+\/\(]+){6,}\)?([ .\-–\/]?)([\d]+)) 我们在使用它时注意到了它:D。好答案
    • 为什么要转义字符类中的所有字符?为什么要放两次连字符?这使您的正则表达式不可读。此外,([\d \-\)\–\+\/\(]+){6,} 中的双量词 +{6,} 没有意义。
    • 小心这个验证也匹配+-+++49 (173) 1799 806-44
    【解决方案2】:
    [0-9]*\/*(\+49)*[ ]*(\([0-9]+\))*([ ]*(-|–)*[ ]*[0-9]+)*
    

    查看此链接:https://regex101.com/r/CAVex8/1

    可能会引入一些误报。

    【讨论】:

      【解决方案3】:

      这个解决了我的问题(从电子邮件中提取电话号码):

      r"\+?[0-9]+([0-9]|\/|\(|\)|\-| ){10,}"

      前面可选加号,后跟至少 1 个数字,后跟至少 10 个数字或分隔字符,例如 /()- 或空格。 (电话号码没有官方的“最小位数”,但我认为它们都至少有 11 位)

      我添加这个是因为 @Kakul 的解决方案与我的文本的任何留置权相匹配,并且使用 @despecial 的我的代码不会终止。 (我猜这对我的电脑来说计算成本太高了)

      【讨论】:

        【解决方案4】:

        这不是问题的解决方案,只是匹配电话号码的建议!

        如果您是第一次为自己存储电话号码,请限制接受的不同格式的数量。例如,摆脱这些:

        (06442) 3933023
        042/ 88 17 890 0
        +49(0)121-79536 - 77
        02162 - 54 91 44 79
        

        为什么? 您需要测试更多可能的输入无效值的方法。

        你绝对需要根据DIN 5008考虑的格式:

        0873 376461
        03748 37682358
        05444 347687-350
        0764 812632-41
        0180 2 12334
        0800 5 23234213
        +49 30 3432622-113
        0179 1111111
        

        这是我想出的:Regex

        ^(([+]{1}[1-9]{1}[0-9]{0,2}[ ]{1}([1-9]{1}[0-9]{1,4}){1}[ ]{1}([1-9]{1}[0-9]{2,6}){1}([ -][0-9]{1,5})?)|([0]{1}[1-9]{1}[0-9]{1,4}[ ]{1}[0-9]{1,8}([ -][0-9]{1,8})?)?)
        

        正面:

        06429 1111
        06901 306180
        06429 231
        0800 3301000
        0179 1111111
        0873 376461
        03748 37682358
        05444 347687-350
        0764 812632-41
        0180 2 12334
        0800 5 23234213
        +49 6429 1111
        +49 39857 2530
        +55 11 2666-0054
        +300 11 2666-0054
        +49 641 20106 0
        +49 641 20106
        +49 30 3432622-113
        

        否定:

        ++49 157 184977
        +300 11 0000-0000
        (06442) 3933023
        (02852) 5996-0
        (042) 1818 87 9919
        06442 / 3893023
        06442 / 38 93 02 3
        06442/3839023
        042/ 88 17 890 0
        +49 221 - 542194 79
        +49 (221) - 542944 79
        0 52 22 - 9 50 93 10
        +49(0)121-79536 - 77
        +49(0)2221-39938-113
        +49 (0) 1739 906-44
        +49 (173) 1799 806-44
        0173173990644
        0214154914479
        01517953677
        +491517953677
        015777953677
        02162 - 54 91 44 79
        (02162) 54 91 44 79
        saddsadasdasd
        asdasd
        asdasd asdasd asd
        asdasd
        kjn asohas  asdoiasd
        23434 234 234 23
        323
        23434 234----234
        ///// ----
        // id8834 3493934 //
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-22
          • 1970-01-01
          • 2019-05-30
          相关资源
          最近更新 更多