[英]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.