【问题标题】:Optimize a regex for German mobile numbers优化德国手机号码的正则表达式
【发布时间】:2021-12-05 13:57:38
【问题描述】:

我有一个从网站中提取德国手机号码的正则表达式:

[^\d]((\+49|0049|0)1[567]\d{1,2}([ \-/]*\d){7})(?!\d)

正如您在demo 中看到的那样,它运行良好。唯一不匹配的模式是:

+49 915175461907

请在链接的演示中查看更多示例。问题是+49 后面的空格。

我需要如何更改当前的正则表达式模式才能匹配这些类型的模式?

【问题讨论】:

  • 单个可选空格可以用空格加问号来匹配。
  • 不要在开头使用[^\d],而是使用负面的后视:(?<!\d)。这样它也将直接匹配字符串的开头。对于这种情况,您当前的正则表达式失败。
  • 不正确的欺骗,因为问题不仅仅是允许空格。如果输入以 +4915207829969 开头,否定字符类 [^\d] 将导致它不匹配

标签: python regex match


【解决方案1】:

添加一个可选的空格:

[^\d]((\+49|0049|0)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)

更新-捕获行首

如果你想匹配数字而不一定以换行符开头,你可以使用它。它匹配除电话号码前的数字以外的任何内容:

 (^|[^\d])((\+49|0049|0)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)

test it here

【讨论】:

    【解决方案2】:

    更好的正则表达式是:

    (?<!\d)(?:\+49|0049|0) *[19][1567]\d{1,2}(?:[ /-]*\d){7,8}(?!\d)
    

    Updated RegEx Demo

    变化:

    • (?&lt;!\d):确保前一个字符不是数字
    • [19][1567]:匹配 19 后跟 [1567] 数字之一
    • {7,8}:匹配给定结构的 7 或 8 次重复
    • 最好在字符类的第一个或最后一个位置保留未转义的连字符
    • 使用非捕获组避免捕获不需要的文本

    【讨论】:

      【解决方案3】:

      无脑方法:在正则表达式之前删除空格。

      否则在正则表达式中匹配非空格是 \s 所以(可能是括号太多)

      [^\d](((\+49|0049|0)([\s]{0,1})1)[567]\d{1,2}([ \-/]*\d){7})(?!\d)
      

      【讨论】:

      • 非常感谢。效果很好,除了开头有 9 这样的数字:+49 915175461907
      猜你喜欢
      • 2013-04-30
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2019-06-22
      相关资源
      最近更新 更多