【问题标题】:Parse Phone Number into component parts将电话号码解析为组件
【发布时间】: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


    【解决方案1】:

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

    Google's library for dealing with phone numbers

    希望对你也有用。

    【讨论】:

    • +1 表示好的资源,-0.1 表示非 .NET(这只是一个偏好)遗憾的是我们正在做整数数学,它被截断为 0。
    • 你能说明这个库是如何将电话号码解析成它的组成部分的吗?正如 OP 提到的,进入区号、交换和后缀?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        首先去掉任何不是数字的东西。然后你所有的例子都归结为:

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

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

        【讨论】:

          【解决方案5】:

          此正则表达式与您的示例完全一样:

          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"];
          

          【讨论】:

          • 将 +1 考虑在内 new Regex(@"1?\(?(?&lt;AreaCode&gt;[0-9]{3})\)?[-. ]?(?&lt;Exchange&gt;[0-9]{3})[-. ]*?(?&lt;Suffix&gt;[0-9]{4})[-. x]?(?&lt;Extension&gt;[0-9]{3})"); 例如+13035551234122
          【解决方案6】:

          这是我使用的:

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

          【讨论】:

          • 这太可怕了。我的眼睛在流血。
          • 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}))?$/
          猜你喜欢
          • 2012-09-14
          • 1970-01-01
          • 1970-01-01
          • 2011-04-09
          • 1970-01-01
          • 2021-10-05
          • 2017-12-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多