【问题标题】:Regex improvements for international, common and RF3966 phone number validation?国际、通用和 RF3966 电话号码验证的正则表达式改进?
【发布时间】:2018-05-14 01:41:20
【问题描述】:

上下文

您好,之前我浏览网页是为了找到关于一个正则表达式公式中的电话号码验证的快速答案:用于紧急号码、短号码、国际号码、法国号码、西班牙号码和北美号码(正常、花式和扩展版本)。

奇怪的是,我找不到比“A comprehensive regex for phone number formula”更好的话题了,因为这似乎是最好的话题,或者我错过了,这是完全可能的。

所以我是该网站的新手,实际上是在写第一个问题(是的!),因为其他线程目前处于某种暂停状态:似乎作者没有得到他和我想要的东西。

这使得我们至少有三个想要一个好的解决方案,至少我认识我的朋友,他首先问我要找到一个用于简单集成的人,比如他的 Google 表单。

因此,我首先提出了我当前的问题和自己的答案,因为我花了一些晚上的时间根据来自另一个线程的最佳回复的建议和测试模式来构建自己的问题。如果您对该主题感兴趣,这里有一些有趣的元素。

问题

优化和改进此正则表达式的最佳方法是什么(无需借助编码),该正则表达式专用于验证国际和大多数国家电话号码(至少遵循 RFC 3966 的建议) ?

不确定我是否也可以添加一个相关问题(因为它仍然是为了提高正则表达式模式的实用性),我想问也无妨。

此正则表达式是否应该匹配(而不是)其他常用格式

如果您可以在此处添加它们(或链接)以便我更新我的测试包,我将不胜感激。同样有用的是绝对不应该验证的电话号码(不需要的)。

我的初步解决方案

另一个潜在的小菜是隔离国家代码、区号和扩展代码的匹配组......在某种程度上,事情相对花哨:只有当有一些分隔符(或括号)来区分时,它才能很好地工作那些数字组。

匹配目标

  • 紧急和短号码:112911
  • 西班牙国际:+34 987 654 321
  • 法语扩展+33 (0)1 23 45 67 89
  • 法国国籍:01 23 45 67 89
  • 美国扩展:001-(123)-456-7890 ext-4321
  • 德语(微软风格):+49 (1234) 567890
  • 墨西哥国民:(01 55) 1234 5678
  • 假设的国际号码(最大长度?):00321-(4321)-567.89 ext-4321

另一个匹配目标是使正则表达式的性能不会太差,也不是很挑剔,因为它不用于代码的关键部分。

不过,我们如何优化人们会发现/提出的最佳正则表达式而不改变他们的结果?

来自主线程的目标

  • +1(234)/567.8901 x1234 等(具有不同的分隔符排列:./- 和水平的whitespaces
  • 2345678901 :我猜是在各州拨打的同一个美国号码。

不知道它应该如何工作,因为我虽然在任何国际号码前都需要+(或等效的双零00)......总是这样做。另一个线程有一个 positive 匹配列表,没有。

有人可以确认+00 不是美国号码的必填项吗?再次感谢您。

最好的不需要的格式

  • 12(34567890123)456789012345 :括号不匹配。
  • )123(34567890 : 括号匹配错误。
  • ++34123456789 : double + 是一个错字。
  • +9-123/456.7890 x12345 : 分机顶部有 4 个数字。
  • 1-234-567-8901 :缺少国际号码开头的 00+
  • 123412345678:不是一个短数字,但也不是一个正常的数字(据我所知,在 9 到 12 之间?)。
  • 1234567890123 :超过最大长度(因为没有国际特征)。
  • 0012312345678901 : 超过最大长度(作为国际号码)。

Regex101.com 是迄今为止重写和测试正则表达式的一大优势,如果没有它的帮助,我不可能取得这么大的进步。然而,我不是专家,所以我只能在这里触及表面,我需要你的帮助来改进这一点

感谢您的阅读,写这个问题很有教育意义(但不是我每天都会做的事情,以我的节奏非常耗时),希望它也能找到答案.祝你有美好的一天(或夜晚......;))。

【问题讨论】:

    标签: regex validation internationalization phone-number tel


    【解决方案1】:

    在我忘记之前,这是我整理的the regex最新版本的帖子及其代码:

    ^(?=(?:\+|0{2})?(?:(?:[\(\-\)\.\/ \t\f]*\d){7,10})?(?:[\-\.\/ \t\f]?\d{2,3})(?:[\-\s]?[ext]{1,3}[\-\.\/ \t\f]?\d{1,4})?$)((?:\+|0{2})\d{0,3})?(?:[\-\.\/ \t\f]?)(\(0\d[ ]?\d{0,4}\)|\(\d{0,4}\)|\d{0,4})(?:[\-\.\/ \t\f]{0,2}\d){3,8}(?:[\-\s]?(?:x|ext)[\-\t\f ]?(\d{1,4}))?$
    

    据我所知,它通过了我在问题中提出的测试以及我在 Regex101.com 页面上添加的更多测试。你甚至可以分叉它,确实非常有用的功能,我是一个新粉丝。 :)

    代码似乎可以正常工作,与 PHP (pcre)、Python 和 Javascript(但不是 Golang)具有不同的性能,虽然并不出色但足以满足我们的目的。

    例如,我想将\h 用于水平空格(而不是\t\fspace,但它与不同平台的兼容性较差。

    它仍然需要很多改进,我很想看看你会做些什么来回答我们的这个小问题,但我已经度过了......这里已经是一个阳光明媚的早晨了。各位晚安。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-22
      • 2019-05-30
      • 2011-05-08
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 2023-04-10
      • 2012-04-04
      相关资源
      最近更新 更多