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