2017-04-26 314 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 

最終形式與其他答案類似,但我覺得這是值得的工作的整個過程。