【发布时间】:2010-09-18 15:42:00
【问题描述】:
我需要一个经过良好测试的正则表达式(首选 .net 样式),或者其他一些简单的代码,可以将美国/加拿大电话号码解析为组件,所以:
- 3035551234122
- 1-303-555-1234x122
- (303)555-1234-122
- 1 (303) 555 -1234-122
等等……
全部解析成:
- 区号:303
- 交换:555
- 后缀:1234
- 分机:122
【问题讨论】:
标签: parsing phone-number
我需要一个经过良好测试的正则表达式(首选 .net 样式),或者其他一些简单的代码,可以将美国/加拿大电话号码解析为组件,所以:
等等……
全部解析成:
【问题讨论】:
标签: parsing phone-number
【讨论】:
这是一个编写良好的库,例如与 GeoIP 一起使用:
【讨论】:
这是 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”, 等等
【讨论】:
首先去掉任何不是数字的东西。然后你所有的例子都归结为:
/^1?(\d{3})(\d{3})(\d{4})(\d*)$/
支持所有国家/地区代码有点复杂,但适用相同的一般规则。
【讨论】:
此正则表达式与您的示例完全一样:
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"];
【讨论】:
new Regex(@"1?\(?(?<AreaCode>[0-9]{3})\)?[-. ]?(?<Exchange>[0-9]{3})[-. ]*?(?<Suffix>[0-9]{4})[-. x]?(?<Extension>[0-9]{3})"); 例如+13035551234122
这是我使用的:
^(?:(?:[\+]?(?<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 那里得到的。
【讨论】:
/^(?:(?:[\+]?(\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}))?$/