2008-10-22 58 views
10

我需要一個行之有效的正則表達式(.NET風格的首選),或代碼將解析USA/CA的電話號碼成各個組成部分的一些其他簡單一點,這樣:解析電話號碼,零部件

  • 1-303-555-1234x122
  • (303)555-1234-122
  • 1(303)555 -1234-122

等...

所有解析爲:

  • AREACODE:303
  • 交易所:555
  • 說明:1234
  • 分機:122

回答

2

這是我使用的一個:

^(?:(?:[\+]?(?<CountryCode>[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?<AreaCode>[\d]{3})[\-/)]?(?:[ ]+)?)?(?<Number>[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?<Ext>[\d]{1,5}))?$ 

我從RegexLib得到它我相信。

+3

太可怕了。我的眼睛在流血。 – 2008-10-22 21:38:59

+0

@保羅嘗試閱讀它formattted這樣http://pastebin.com/n9eQjRst – 2011-07-15 12:05:20

+0

JavaScript沒有命名的組,它不捕獲擴展,直到我把?在{6,}範圍之後。受傷:`/^(?:(?:[\+]?(\d{1,3}(?:\s+|[\-\]))?[\(]?(\d {3})[\ - \ /)]?(?:\ s +)?)?([a-zA-Z2-9] [a-zA-Z0-9 \ - \。] {6,}?) ?(:(:\ S + | [XX] |(?:?[EE] XT [\])){1,2}(\ d {1,5}))$ /` – 2014-08-19 20:03:21

1

地帶出什麼,這不是一個數字第一。然後,所有你的例子減少:

/^1?(\d{3})(\d{3})(\d{4})(\d*)$/

要支持所有的國家代碼是稍微複雜,但相同的一般規則適用。

+1

爲什麼這個downvoted? – 2009-09-05 00:09:25

1

此正則表達式的工作原理完全一樣,你想用你的例子:

Regex regexObj = new Regex(@"\(?(?<AreaCode>[0-9]{3})\)?[-. ]?(?<Exchange>[0-9]{3})[-. ]*?(?<Suffix>[0-9]{4})[-. x]?(?<Extension>[0-9]{3})"); 
Match matchResult = regexObj.Match("1 (303) 555 -1234-122"); 

// Now you have the results in groups 
matchResult.Groups["AreaCode"]; 
matchResult.Groups["Exchange"]; 
matchResult.Groups["Suffix"]; 
matchResult.Groups["Extension"]; 
0

這裏有一個方法,通過對美國的電話號碼面向在Z目錄(vettrasoft.com), 提供的眼睛更容易:

string_o s2, s1 = "888/872.7676"; 
z_fix_phone_number (s1, s2); 
cout << s2.print();  // prints "+1 (888) 872-7676" 
phone_number_o pho = s2; 
pho.store_save(); 

最後一行存儲到數據庫表「PHONE_NUMBER」的數量。 列值:country_code =「1」,area_code =「888」,exchange =「872」, 等