当前位置: 首页 > 知识库问答 >
问题:

用于国际、通用和RF3966电话号码验证的正则表达式改进?

越景天
2023-03-14

您好,早些时候我在浏览网页,以便在一个正则表达式中找到有关电话号码验证的快速答案:紧急、简短、国际、法语、西班牙语和北美号码(普通、新奇和扩展版本)。

奇怪的是,我找不到比“电话号码公式的综合正则表达式”更好的了,因为它似乎是关于这个的最好的话题,或者我错过了它,这是完全可能的。

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

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

因此,我现在的问题和我自己的答案开始了,因为我花了一些晚上的时间来建立我自己的基于建议和测试模式,从最好的回答在另一个线程。如果你对这个话题感兴趣,这里有一些有趣的元素。

什么是优化和改进这个正则表达式(不诉诸编码)的最佳方式,它致力于验证国际和大多数国家的电话号码(至少按照RFC 3966的建议)?

我不确定是否可以添加一个相关的问题(因为它仍然是为了提高regex模式的有用性),我想问这个问题没有什么坏处。

这个正则表达式是否应该匹配其他常用格式?

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

  • 我在正则表达式101上的当前正则表达式解决方案(版本4)
  • 早期的版本尽管有前导空格和尾随空格,但仍然匹配结果,在这一点上用处不大(对于执行时间来说有点太花哨了)
  • 在撰写本文时,最新版本考虑了关于RFC3966主题的其他帖子(来自IETF标准)和维基百科关于“书写电话号码的自然约定”的文章

另一个潜在的附带措施是隔离国家代码、区号和扩展代码的匹配组。。。在某一点上,事情做得相当不错:只有当有一些分隔符(或括号)来区分这些数字组时,它才能很好地工作。

  • 紧急和短号码:112911

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

然而,我们如何在不改变结果的情况下优化人们将发现/提出的最佳正则表达式?

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

不确定它应该如何工作,因为我认为在任何国际号码前都需要(或其等效的双零00)。。。总是那样做的。另一个线程有一个正匹配列表,但没有。

有人能确认00对美国号码不是强制性的吗?再次感谢你。

  • 12(34567890123)456789012345:不匹配的括号。
  • )123(34567890:括号错误匹配。
  • 34123456789:双是一个错别字。
  • 9-123/456.7890x12345: ext4个数字顶。
  • 1-234-567-8901:国际编号开头缺少00
  • 1234to12345678:不是一个短的数字,但不是一个正常的数字(在9和12之间?据我所知)。
  • 1234567890123:超过最大长度(因为没有国际功能)。
  • 0012312345678901:超过最大长度(作为国际号码)。

Regex101。com是重写和测试正则表达式的一大利器,到目前为止,如果没有它的帮助,我不可能取得进展。然而,我不是专家,所以我只能触及表面,我需要你的帮助来改善这一点。

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

共有1个答案

谭嘉容
2023-03-14

在我忘记之前,这是我放在一起的正则表达式的最新版本及其代码的帖子:

^(?=(?:\+|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\f空格),但它与不同平台的兼容性较差。

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

 类似资料:
  • 在注册会员时,经常需要输入电话号码,电话号码是指手机号码或者固定电话。如果输入的内容不合法,则会向用户输出提示。本实例模拟实现电话号码的验证功能,接收用户在控制台输入的电话号码,然后进行判断,并将结果输出。 在这里使用《 Java正则表达式》一节中讲到的正则表达式支持的字符来实现,步骤如下。 (1) 创建名为 Test21.java 的 Java 文件,在 main() 方法中开始编写代码。 (2

  • 我正在修改一个脚本。该脚本包含一个表单,允许访问者向电话号码发送短信。在表单中,我有一个文本框,用户在其中输入文本接收器的电话号码。我正在使用正则表达式验证电话号码,以防止垃圾邮件发送者,并确保用户键入正确的号码。 以下是阿富汗使用的默认电话号码: 正则表达式验证首先应该确保使用93,然后确保在93之后使用78、77、79或700(其中之一),最后是6位数。 下面是我试图修复的Javascript

  • 我需要有关验证电话号码的正则表达式行的帮助,它如下所示: 这些是它验证的格式: 我想验证如下数字: +263 772 485 384 773456284 0773456284 大部分是国际号码

  • 我正试图建立一个全面的正则表达式来验证电话号码。理想情况下,它将处理国际格式,但它必须处理美国格式,包括以下内容: 我将用我目前的尝试来回答,但我希望有人有更好和/或更优雅的东西。

  • 我有一个英国电话号码的PHP验证,由潜在客户在我的表格中计算。它看起来像这样: 问题是,在这种形式下,它只允许电话号码前面有一个0,后面有十个数字(),而且最近也有合法的电话号码,前面的零后面有十一个数字。 如何更改代码以允许使用这些类型的电话号码?

  • 本文向大家介绍Java使用正则表达式验证手机号和电话号码的方法,包括了Java使用正则表达式验证手机号和电话号码的方法的使用技巧和注意事项,需要的朋友参考一下 一个朋友需要,所以写了这两个,话不多说,看代码 中国电信号段 133、149、153、173、177、180、181、189、199 中国联通号段 130、131、132、145、155、156、166、175、176、185、186 中国