【问题标题】:Regex phone number正则表达式电话号码
【发布时间】:2017-09-23 20:20:53
【问题描述】:

我正在尝试解决一个问题,我发现最好的解决方案是使用正则表达式。

我没有关于正则表达式的高级知识,所以我真的需要你的帮助。

问题是我需要按照我们在巴西使用的方式来识别字符串是电话号码还是手机,如下所示:

电话号码可以是这种格式:

0 + XX + XXXXXXXX = 01121234567

或者

XX + XXXXXXXX = 1121234567

或者

XXXXXXXX = 21234567

这里是电话号码,所以需要以 2,3,4 或 5 开头

如果是手机,它有 9 个数字,必须以 9 开​​头,排他性,第二个数字必须是 6,7 或 8:

0 + XX + 9XXXXXXXX = 011961234567

或者

XX + 9XXXXXXXX = 11971234567

或者

9XXXXXXXX = 981234567

因此,例如,如果我得到字符串“011984160986”、“11984160986”或“984160986”,我需要能够识别它是一部手机,电话号码也是如此。

同时我必须能够检查那个字符串“84160289”它不是一个有效的电话号码。

任何人都可以用正则表达式解决这个问题吗?

我不喜欢在我的代码中使用大量“ifs”来验证这一点。

谢谢。

【问题讨论】:

  • 您说“第二个数字必须是 6,7 或 8”,但在手机示例中他们不这样做。
  • 我的错,错了
  • “我正在尝试解决一个问题,我发现最好的解决方案是使用正则表达式。” Now you have two problems

标签: regex


【解决方案1】:

电话号码的正则表达式是

\b(0?\d\d)?[2345]\d{7}\b

手机号码的正则表达式是

\b(0?\d\d)?9[678]\d{7}\b

同时验证它们的正则表达式是

\b(0?\d\d)?([2345]|9[678])\d{7}\b

查看演示:1、2、3。

\d 转义符的工作方式取决于您的语言。如果不起作用,请尝试将其替换为 [0-9]。

【讨论】:

  • 是的,正则表达式正是我所需要的,除了一件事:我做了一些测试,如果我添加一个大数字,正则表达式会匹配 2 次,例如 regex101.com/r/0BI89u/1 。最后的 \d{7} 并不意味着它在此之后只允许 7 个字符?
  • @RaphaelTelatim 哦,对。我已经使用单词边界更新了答案(请参阅https://regex101.com/r/0BI89u/2)。
【解决方案2】:

当我开始研究正则表达式时,我喜欢先从最简单的方法开始。

注意 1:我喜欢使用 free spacing 正则表达式。它有助于提高可读性。

注意 2:我没有使用 \d 来避免 unicode 数字可能出现的问题。如果允许 unicode 数字,则使用\d。

0 + XX + XXXXXXXX = 01121234567

0 [0-9]{2} [0-9]{8}

XX + XXXXXXXX = 1121234567

[0-9]{2} [0-9]{8}

XXXXXXXX = 21234567

[0-9]{8}

这里是电话号码,所以需要以 2,3,4 或 5 开头

好的,现在我们有更多限制。让我们从这里开始缩小范围?

(0 [0-9]{2} [2-5] [0-9]{7} |
   [0-9]{2} [2-5] [0-9]{7} |
            [2-5] [0-9]{7})

有了这么多共同点,我们可以压缩更多。

(0 [0-9]{2} | [0-9]{2})? [2-5] [0-9]{7}

最后再次压缩

(0? [0-9]{2})? [2-5] [0-9]{7}

如果是手机,它有 9 个数字,必须以 9 开​​头,排他性,第二个数字必须是 6,7 或 8:

0 + XX + 9XXXXXXXX = 011961234567

0 [0-9]{2} 9 [6-8] [0-9]{7}

XX + 9XXXXXXXX = 11971234567

[0-9]{2} 9 [6-8] [0-9]{7}

9XXXXXXXX = 981234567

9 [6-8] [0-9]{7}

将它们组合起来效果相同

(0? [0-9]{2})? 9 [6-8] [0-9]{7}

将电话和固定电话放在一起

((0? [0-9]{2})? [2-5]   [0-9]{7} |
 (0? [0-9]{2})? 9 [6-8] [0-9]{7})

这个可以压缩成

(0? [0-9]{2})? ([2-5] | 9 [6-8]) [0-9]{7}

如果适合您的需要,请使用 word boundaries 嵌入此功能。

\b (0? [0-9]{2})? ([2-5] | 9 [6-8]) [0-9]{7} \b

最终形式与其他答案相似,但我觉得整个过程都值得。

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 2016-02-02
    • 2011-12-14
    • 2013-05-26
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多