将电话号码解析为组件部分

时间:2008-10-22 20:43:04

标签: parsing phone-number

我需要一个经过良好测试的正则表达式(首选.net样式),或其他一些将美国/加拿大电话号码解析为组件部分的简单代码,所以:

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

等...

全部解析成:

  • AreaCode:303
  • 交流:555
  • 后缀:1234
  • 分机:122

6 个答案:

答案 0 :(得分:19)

到目前为止给出的答案对我来说都不够强大,所以我继续寻找更好的东西,我找到了它:

Google's library for dealing with phone numbers

我希望它对你有用。

答案 1 :(得分:3)

这是我使用的那个:

^(?:(?:[\+]?(?<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得到的。我相信。

答案 2 :(得分:1)

首先删除任何不是数字的内容。然后你的所有例子都缩减为:

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

支持所有国家/地区代码有点复杂,但适用相同的一般规则。

答案 3 :(得分: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"];

答案 4 :(得分:1)

这是一个与GeoIP一起使用的编写良好的库,例如:

http://highway.to/geoip/numberparser.inc

答案 5 :(得分: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”, 等