我需要一个经过良好测试的正则表达式(首选 .net 样式),或者一些其他简单的代码,可以将 USA/CA 电话号码解析为组件,所以:
- 3035551234122
- 1-303-555-1234x122
- (303)555-1234-122
- 1 (303) 555 -1234-122
ETC...
全部解析为:
- 区号:303
- 交易所:555
- 后缀:1234
- 分机:122
我需要一个经过良好测试的正则表达式(首选 .net 样式),或者一些其他简单的代码,可以将 USA/CA 电话号码解析为组件,所以:
ETC...
全部解析为:
这是我使用的一个:
^(?:(?:[\+]?(?<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得到的。
首先去掉任何不是数字的东西。然后您的所有示例都简化为:
/^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"];
这是一个与 GeoIP 一起使用的编写良好的库,例如:
这是 Z Directory (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”等。