我想從文件中獲取電話號碼。我知道數字有不同的形式,我可以處理一個,但不知道如何獲得統一的正則表達式。例如grep與正則表達式的電話號碼
xxx-xxx-xxxx
(xxx)xxx-xxxx
xxx xxx xxxx
xxxxxxxxxx
我只能處理1,2,一個d 4在一起
grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
是否有任何一個單一的正則表達式可以處理所有這四種形式?
我想從文件中獲取電話號碼。我知道數字有不同的形式,我可以處理一個,但不知道如何獲得統一的正則表達式。例如grep與正則表達式的電話號碼
xxx-xxx-xxxx
(xxx)xxx-xxxx
xxx xxx xxxx
xxxxxxxxxx
我只能處理1,2,一個d 4在一起
grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
是否有任何一個單一的正則表達式可以處理所有這四種形式?
grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
說明:括號內
\|
或
([0-9]\{3\})
三位數3210個[0-9]\{3\}
三位數不裏的括號
...與分組圓括號 - \(...\)
- 周圍的交替,因此正則表達式的其他行爲一樣,無論哪個備選的匹配。
的[輕微]這個問題的正則表達式是,它也有不少匹配更多這比grep'\(\(([0-9] \ {3 \})\ | [0])要高出4位數,例如123-123-12345或者數字超過10位的數字。 -9] \ {3 \} \)[ - ?] \ \)\ {2 \} [0-9] \ {4 \}「'應該處理很好地見下面我的答覆爲解釋乾杯!! – MacUsers 2013-04-07 11:23:36
。 @MacUsers:好點OP只問如何獲得正則表達式匹配一切都應該匹配,我回答說,得到它的*不*匹配的東西不應該是更加有趣 – 2013-04-07 21:30:50
請注意,另一個伎倆。這裏使用的是序列「[ - ]?\」這使匹配的空間,一個連字符,或者用來分隔數字組中的電話號碼 – 2015-04-25 17:15:23
你可以只是或者(|
)將你的正則表達式組合在一起 - 這樣也會更具可讀性!
評論你能告訴我一個例子?我知道OR(|)可能工作,但我沒有弄清楚如何。 – skydoor 2010-02-16 00:34:59
我的第一個想法是,您可能會發現,更容易看到您的候選人編號是否與四個正則表達式中的一個匹配。這將更容易開發/調試,特別是當您將來需要處理其他格式時。
我得到這個:
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$
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}'
試試這個:
^(\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})$
這是隻適用於甲你提到像上面這樣:
xxxxxxxxxx
xxx xxx xxxx
xxx-xxx-xxxx
(xxx)xxx-xxxx
通常有電話號碼的四種模式
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本身〜
這只是Alan Moore解決方案的修改版本。
grep '\(\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?\)\{2\}[0-9]\{4\} '
說明:
\(([0-9]\{3\})\|[0-9]\{3\}\)
恰好與三個數字(例如234) 匹配,有或沒有括號包圍。 \|
執行'OR'操作。\(... \)
將上述格式組合在一起後面跟着一個space
或-
或no space
- ([ -]\?
)這樣做。\{2\}
比賽恰好出現兩次以上[0-9]\{4\} '
匹配完全按照一個發生了4位數字由space
而且它有點短爲好。在RHEL和Ubuntu上進行測試。乾杯!!
真棒解釋任何其他字符!節省我的時間去尋找教程! – FisherCoder 2016-07-02 16:56:29
我們可以將所有需要的電話號碼驗證一個接一個地使用或更有可能運作良好的條件(但繁瑣的編碼)。
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
返回所有特定格式:
+ ?(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
grep -oE '\(?\<[0-9]{3}[-) ]?[0-9]{3}[ -]?[0-9]{4}\>'
匹配所有格式。
的\<
和\>
字邊界防止匹配過長的數字,如123-123-12345
或1234-123-1234
你將不得不通過交替單獨處理2(|)。問題是,使用基本的正則表達式,沒有辦法來判斷其他人是否平衡。 – Joel 2010-02-15 23:32:59
退房Regexr對正則表達式的幫助... http://www.gskinner.com/RegExr/ – Moshe 2010-02-16 01:10:54
見下面 – 2015-04-25 17:13:25