【问题标题】:Regular expression for valid US phone number有效美国电话号码的正则表达式
【发布时间】:2018-01-23 18:48:52
【问题描述】:

我正在尝试从错误的电话号码条目中清除数据集。在 MySQL 中为过滤器制作正则表达式时遇到问题。

结构如下:
第一个数字在 2-9
第二位和第三位数字可以是任何数字但它们可能不是同一个数字
第四位在 2-9
第五和第六位可以是任何数字除了'11'

我已经找到了一些相当复杂的 reg 表达式,但它们并不太奏效;但我确信有一种简单的方法。

“有效”数字可能如下所示:
2028658680
7137038891

我的过滤器通常会漏掉以下情况:
6778914351
7777777777
6178116678

请注意,这些数字完全是虚构的。

【问题讨论】:

  • 能否提供与您的案例相匹配的样品
  • 添加了一些虚构的例子
  • 您无法使用正则表达式满足这些条件。具体来说,就是某些角色的需求依赖于其他角色的部分。
  • [2-9](\d)(?!\1)\d[2-9](?!11)\d{2}
  • 您被困在这里,因为 MySQL 不支持 backreferences,因此您的第二个条件无法使用 MySQL 正则表达式进行编码。好吧,它也不支持环视,这使得实现最后一个条件有点困难。无法使用 MySQL 正则表达式解决问题。

标签: mysql regex


【解决方案1】:

这是可能的,但它会很长而且很难看。使用更强大的正则表达式引擎,您可以执行环视甚至条件语句,但据我所知 MySQL 不支持此类事情。

^[2-9](?:0[1-9]|1[02-9]|2[013-9]|3[0-24-9]|4[0-35-9]|5[0-46-9]|6[0-57-9]|7[0-689]|8[0-79]|9[0-8])[2-9](?:1[02-9]|[02-9]1|[02-9]{2})[0-9]{4}$

https://regex101.com/r/qPuS5W/1

解释:

[2-9] 第一个数字是从 2 到 9 的任意数字。

(?:0[1-9]|1[02-9]|2[013-9]|3[0-24-9]|4[0-35-9]|5[0-46-9]|6[0-57-9]|7[0-689]|8[0-79]|9[0-8]) 包含 10 个替代项的非捕获组,从每个数字 0 到 9 开始,后跟除该数字之外的任何数字。

(?:1[02-9]|[02-9]1|[02-9]{2}) 匹配 1 后跟非 1 数字、非 1 后跟 1 或两个非 1 数字的非捕获组。

[0-9]{4} 任意数量的 4 个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多