我的应用程序有三种类型的手机格式:
//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。
答案 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*)$
- 扩展的命名组,匹配零个或多个数字,以防它不存在。也匹配字符串的结尾。