12

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

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

ETC...

全部解析为:

  • 区号:303
  • 交易所:555
  • 后缀:1234
  • 分机:122
4

6 回答 6

21

到目前为止,没有一个答案对我来说足够强大,所以我继续寻找更好的东西,我找到了:

谷歌处理电话号码的库

我希望它对你也有用。

于 2011-07-15T11:41:28.843 回答
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得到的。

于 2008-10-22T20:52:18.263 回答
1

首先去掉任何不是数字的东西。然后您的所有示例都简化为:

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

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

于 2008-10-22T20:57:21.963 回答
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"];
于 2008-10-22T21:07:19.603 回答
1

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

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

于 2011-07-09T09:45:02.083 回答
0

这是 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”等。

于 2013-05-31T19:23:20.303 回答