2010-02-15 77 views
11

我想從文件中獲取電話號碼。我知道數字有不同的形式,我可以處理一個,但不知道如何獲得統一的正則表達式。例如grep與正則表達式的電話號碼

  1. xxx-xxx-xxxx

  2. (xxx)xxx-xxxx

  3. xxx xxx xxxx

  4. xxxxxxxxxx

我只能處理1,2,一個d 4在一起

grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file 

是否有任何一個單一的正則表達式可以處理所有這四種形式?

+0

你將不得不通過交替單獨處理2(|)。問題是,使用基本的正則表達式,沒有辦法來判斷其他人是否平衡。 – Joel 2010-02-15 23:32:59

+0

退房Regexr對正則表達式的幫助... http://www.gskinner.com/RegExr/ – Moshe 2010-02-16 01:10:54

+0

見下面 – 2015-04-25 17:13:25

回答

12
grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file 

說明:括號內

\|

([0-9]\{3\})三位數3210個[0-9]\{3\}三位數裏的括號

...與分組圓括號 - \(...\) - 周圍的交替,因此正則表達式的其他行爲一樣,無論哪個備選的匹配。

+0

的[輕微]這個問題的正則表達式是,它也有不少匹配更多這比grep'\(\(([0-9] \ {3 \})\ | [0])要高出4位數,例如123-123-12345或者數字超過10位的數字。 -9] \ {3 \} \)[ - ?] \ \)\ {2 \} [0-9] \ {4 \}「'應該處理很好地見下面我的答覆爲解釋乾杯!! – MacUsers 2013-04-07 11:23:36

+0

。 @MacUsers:好點OP只問如何獲得正則表達式匹配一切都應該匹配,我回答說,得到它的*不*匹配的東西不應該是更加有趣 – 2013-04-07 21:30:50

+0

請注意,另一個伎倆。這裏使用的是序列「[ - ]?\」這使匹配的空間,一個連字符,或者用來分隔數字組中的電話號碼 – 2015-04-25 17:15:23

2

你可以只是或者(|)將你的正則表達式組合在一起 - 這樣也會更具可讀性!

+0

評論你能告訴我一個例子?我知道OR(|)可能工作,但我沒有弄清楚如何。 – skydoor 2010-02-16 00:34:59

1

我的第一個想法是,您可能會發現,更容易看到您的候選人編號是否與四個正則表達式中的一個匹配。這將更容易開發/調試,特別是當您將來需要處理其他格式時。

-2

我得到這個:

debian:tmp$ cat p.txt 
333-444-5555 
(333)333-6666 
123 456 7890 
1234567890 
debian:tmp$ egrep '\(?[0-9]{3}[)-]?[0-9]{3}[ -]?[0-9]{4}' p.txt 
333-444-5555 
(333)333-6666 
123 456 7890 
1234567890 
debian:tmp$ egrep --version 
GNU grep 2.5.3 

Copyright (C) 1988, 1992-2002, 2004, 2005 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

debian:tmp$ 
+0

這將匹配(333-444-555也。 – Joel 2010-02-15 23:30:52

+0

是的,所以它會的。 – Segfault 2010-02-15 23:50:49

+0

我試過,但我不認爲這是正確的。 – skydoor 2010-02-16 00:24:31

1
grep -P '[0-9]{3}-[0-9]{3}-[0-9]{3}|[0-9]{3}\ [0-9]{3}\ [0-9]{3}|[0-9]{9}|\([0-9]{3}\)[0-9]{3}-[0-9]{3}' 
0

試試這個:

^(\d{10}|((([0-9]{3})\s){2})[0-9]{4}|((([0-9]{3})\-){2})[0-9]{4}|([(][0-9]{3}[)])[0-9]{3}[-][0-9]{4})$

這是隻適用於甲你提到像上面這樣:

  1. xxxxxxxxxx
  2. xxx xxx xxxx
  3. xxx-xxx-xxxx
  4. (xxx)xxx-xxxx
5

通常有電話號碼的四種模式

1. xxx-xxx-xxxx   grep -o '[0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}' file.txt 
2. (xxx)xxx-xxxx  grep -o '([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}' file.txt 
3. xxx xxx xxxx   grep -o '[0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}' file.txt 
4. xxxxxxxxxx   grep -o '[0-9]\{10\}' file.txt 

在所有

grep -o '\([0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}\)\|\(([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}\)\|\([0-9]\{10\}\)\|\([0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}\)' file.txt 

當然,一個可以簡化上述正則表達式,但我們也可以把這種簡化到grep本身〜

2

這只是Alan Moore解決方案的修改版本。

grep '\(\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?\)\{2\}[0-9]\{4\} ' 

說明:

    這是對一些競爭條件,其中數字的最後一部分中有超過四位數或如果數字的總數超過10保護
  1. \(([0-9]\{3\})\|[0-9]\{3\}\)恰好與三個數字(例如234) 匹配,有或沒有括號包圍。 \|執行'OR'操作。
  2. 第一個\(... \)將上述格式組合在一起後面跟着一個space-no space - ([ -]\?)這樣做。
  3. \{2\}比賽恰好出現兩次以上
  4. [0-9]\{4\} '匹配完全按照一個發生了4位數字由space

而且它有點短爲好。在RHEL和Ubuntu上進行測試。乾杯!!

+0

真棒解釋任何其他字符!節省我的時間去尋找教程! – FisherCoder 2016-07-02 16:56:29

0

我們可以將所有需要的電話號碼驗證一個接一個地使用或更有可能運作良好的條件(但繁瑣的編碼)。

grep '^[0-9]\{10\}$\|^[0-9]\{3\}[-][0-9]\{3\}[-][0-9]\{4\}$\|^[0-9]\{3\}[ ][0-9]\{3\}[ ][0-9]\{4\}$\|^[(][0-9]\{3\}[)][0-9]\{3\}[-][0-9]\{4\}$' phone_number.txt 

返回所有特定格式:

  • 920-702-9999
  • (920)702-9999
0

+ ?(1 [ - ])?((\ d {3})[ - ] |(\ d {3} [ - ]?)){2} \ d {4}

作品:

123-678-1234

(123)-678-1234

+1 - (123)-678-1234

1-(123)-678-1234

1(123)678 1234

0
grep -oE '\(?\<[0-9]{3}[-) ]?[0-9]{3}[ -]?[0-9]{4}\>' 

匹配所有格式。

\<\>字邊界防止匹配過長的數字,如123-123-123451234-123-1234