使用RegEx解析电话号码格式

时间:2014-04-24 14:56:40

标签: c# regex

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

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

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

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

所以我想用一种格式来解析它们,这种格式给了我一个像#34; 7182224568"和#34; 3376"如果它存在,它的电话分机。 我可以用普通的字符串操作方法编写它,但我想知道是否有更好的方法可能使用RegEx?我不熟悉RegEx tho。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这是一种可行的方法:

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();
}

您可以在&#34; Ext&#34;上使用String.IsNullOrEmpty来检查扩展名。基。

模式细分:

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