繁体   English   中英

使用RegEx解析电话号码格式

[英]Parsing phone number formats with RegEx

我的应用程序有三种类型的手机格式:

    //tel:+17548758181;ext=8142
    //718-222-4568
    //718-333-1234 ext/option 718280

所以我知道的最小格式是:

tel:+bunchofNumbers;ext=bunchOfNumbers
###-###-####
###-###-#### ext/option bunchofnumbers

因此,我希望以一种格式解析它们,如果它存在的话,它会给我一个像“7182224568”这样的电话和类似“3376”的电话分机。 我可以用普通的字符串操作方法编写它,但我想知道是否有更好的方法可能使用RegEx? 我不熟悉RegEx。

世界各地的电话号码差异很大。 即使在美国,这些数字也可以是全球(+64215551212,新西兰的数字)或地区代码(5551212)或本地(6175551212,波士顿的数字[我希望])。

除非您需要实际拨打电话,否则最好的方法是允许最终用户输入任何内容。

这是一种可能的方法:

string[] inputs = 
{
    "tel:+17548758181;ext=8142",
    "718-222-4568",
    "718-333-1234 ext/option 718280" 
};
var pattern = @"^\D*?(?:\+1)?(?<Number>\d{10}|\d{3}-\d{3}-\d{4})\D*(?<Ext>\d*)$";

foreach (var input in inputs)
{
    var match = Regex.Match(input, pattern);
    Console.WriteLine("{0}: {1}", match.Success, input);
    if (match.Success) 
    {
        Console.WriteLine("Number: {0}, Ext: {1}",
            match.Groups["Number"].Value.Replace("-", ""),
            match.Groups["Ext"].Value);
    }
    Console.WriteLine();
}

您可以通过在“Ext”组上使用String.IsNullOrEmpty来检查扩展名。

模式细分:

  • ^\\D*? - 匹配字符串的开头( ^ ),以及零个或多个非数字( \\D* )。 由于数字中的“+1”有资格作为非数字,我通过添加问号元字符使非数字检查非贪婪,因此\\D*?
  • (?:\\+1)? - 非捕获组以匹配可选的“+1”号码
  • (?<Number>\\d{10}|\\d{3}-\\d{3}-\\d{4}) - 带有和不带短划线的数字的命名组
  • \\D* - 如果存在扩展名,则匹配零个或多个非数字
  • (?<Ext>\\d*)$ - 扩展命名组,匹配零个或多个数字,以防它不存在。 也匹配字符串的结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM