2016-05-31 197 views
1

我有一堆我想分析的數字。正則表達式匹配不同格式的電話號碼

+79261234567 
89261234567 
79261234567 
9261234567 
+7 926 123 45 67 
8(926)123-45-67 
123-45-67 
79261234567 
(495)1234567 
(495) 123 45 67 
89261234567 
8-926-123-45-67 
8 927 1234 234 
8 927 12 12 888 
8 927 12 555 12 
8 927 123 8 123 

我來到第一處是什麼,通過這樣

(\+[\d]{11}|[\d]{10,11}|\+\d\ [\d]{3}\ [\d]{3}\ [\d]{2}\ [\d]{2}|\d\([\d]{3}\)[\d\-]{9}|[\d\ ]{14,15}|[\d\-]{14,15}|[\d\-]{9}|\(\d\d\d\)[\d\-]{9,10}|\(\d\d\d\)[\d\ ]{9,10}|\(\d\d\d\)[\d\-]{7}) 

所有變種週期是否有更優雅的方式來匹配這些數字呢?

+2

試圖捕捉某種可能的方式來記錄某個電話號碼並不是很優雅,所以我想這裏也沒有優雅的正則表達式。 –

+0

我只是檢查字符串是否包含最小位數,並讓用戶輸入他的電話號碼;) –

+0

我同意。爲什麼不從你的輸入中除去數字和加號('[^ + 0-9] +'「),然後解析剩下的內容? –

回答

0

此正則表達式將匹配所有的例子並沒有太多額外的:

[+]?(\b\d{1,2}[ -]?)?([(]?\d{3}[)]?)((?:[ -]?\d){4,7})(?![ -]?\d) 

它可以包含7到12位數字。

儘管還是會匹配這樣的事情:

+12 (345) 6-7-8 9-0-1 

但應該是在可接受的範圍之內。

但是,那個人仍然可以匹配一個更長的數字的一部分。
並避免它需要一些負面的後視。
(注意,有在JavaScript正則表達式沒有查找屁股)

[+]?(?<!\d)(?<!\d[ -])(?:((\d{1,2}[ -]?)?[(]?\d{3}[)]?[ -]?)(\d(?:[ -]?\d){3,6}))(?![ -]?\d) 

下面是這最後一個regex101 test

+1

在字符類中放入'\ d'打開了數字完全非數字並以數字結尾的能力。如'------ 2' – 4castle

+0

@ 4castle好點。 :)我添加了一個警告。 – LukStorms

+0

對於大多數國際號碼和超過2個號碼的代碼,這一個將會失敗。例如。 +493025554433,+330140205317等 – SublimeYe

0

要有一個更優雅的解決方案,你將不得不使模式更放鬆。一種選擇是捕捉7,10,或11個數字由0或多個分隔符分開:

\+?(?:[()-]*\d){10,11}|(?:[()-]*\d){7} 

Regex101 Tested

+0

這是一種踢在路上的罐頭雖然..當它是一個8位數字,或14?你最終會在OP現在處於相同的情況下,只是將OR'放在一起放寬長度正則表達式。 – CDahn

+0

@CDahn他們可以說7個或更多的數字然後:'\ +?(?:[() - ] * \ d){7,}' – 4castle

+0

是的,但我認爲原文的精神是爲了確定格式。儘管OP沒有這樣說,但我認爲他真正想要的是驗證國家代碼等。如果您只是想確定您有10個數字,那麼我肯定會同意您的正則表達式是正確的方式去做吧,但肯定他不能這麼說......對嗎? :-) – CDahn