使用RegEx分析电话号码格式

本文关键字:电话号码 格式 RegEx 使用 | 更新日期: 2023-09-27 17:59:58

我的应用程序中有三种类型的电话格式:

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

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

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

所以我想用一种格式来解析它们,如果它存在的话,我会得到一个类似"7182224568"的电话,以及类似"3376"的电话扩展名。我可以用普通的字符串操作方法编写它,但我想知道是否有更好的方法可以使用RegEx?我不熟悉RegEx tho。

使用RegEx分析电话号码格式

世界各地的电话号码差异很大。即使在美国,这些号码也可以是全球号码(+6425551212,新西兰的一个号码)、本地区号(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*)$-扩展名的命名组,如果不存在,则匹配零个或多个数字。还要匹配字符串的末尾