2017-04-26 143 views
0

我试图解决一个问题,我发现最好的解决方案是使用正则表达式。Regex电话号码

我没有先进的正则表达知识,所以我真的需要你的帮助。

的问题是,我需要确定一个字符串是否是电话号码或手机,我们在巴西在这里使用的方式,像这样:

的电话号码可能是这种格式:

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”来验证这一点。

谢谢。

+0

你说“第二位必须是6,7或8”,但在手机的例子中,他们不这样做。 – horcrux

+0

我的不好,这是错误的 –

+0

*“我试图解决一个问题,我发现最好的解决方案是使用正则表达式。”* [现在你有两个问题](https://en.wikiquote.org/wiki/Jamie_Zawinski#归因于) –

回答

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]

+0

是的,正则表达式正是我所需要的,除了一件事:我做了一些测试,如果我添加一个大数字,正则表达式做了两个匹配,如https://regex101.com/r/0BI89u/1。 \ d {7}最终并不意味着在此之后它只允许7个字符? –

+0

@RaphaelTelatim哦,对。我已经使用单词边界更新了答案(请参阅[https://regex101.com/r/0BI89u/2](https://regex101.com/r/0BI89u/2))。 – horcrux

+0

坦克很多人! –

0

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

注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 

最终形式与其他答案类似,但我觉得这是值得的工作的整个过程。