2008-10-22 60 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”, 等