檢查不同格式電話號碼的最佳方法是什麼?檢查電話號碼是否等同
不同的格式:
「(708)399 7222」
「7083997222」
「708-399-7222」
「708399-7222」
「 +1(708)399-7222「
」+1(708)399-7222「
其他難度:如果電話號碼不是國家代碼的前綴,該怎麼辦?
檢查不同格式電話號碼的最佳方法是什麼?檢查電話號碼是否等同
不同的格式:
「(708)399 7222」
「7083997222」
「708-399-7222」
「708399-7222」
「 +1(708)399-7222「
」+1(708)399-7222「
其他難度:如果電話號碼不是國家代碼的前綴,該怎麼辦?
不能使用一個正則表達式。要獲得可以比較的規範表示形式:
00
。如果您只需處理來自單個國家的呼叫,例如您正在爲電話公司的內部使用開發某些內容,這就足夠了。如果你不得不接受來自不同國家的各種各樣的輸入和不同的前綴,我建議找一個經過良好測試的庫來做到這一點。
是否可以處理一個版本的電話號碼包含國家/地區代碼的可能性,但另一個版本可能不會? – Apollo
@Auser我已經更新瞭解決方案。請看看我的解決方案 –
您可以實現PhoneEqualityComparer
類。如果你只與美國數字處理,下面的代碼將工作:
sealed class PhoneEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return string.Equals(NormalizePhone(x), NormalizePhone(y));
}
public int GetHashCode(string obj)
{
return NormalizePhone(obj).GetHashCode();
}
private static string NormalizePhone(string phone)
{
if (phone.StartsWith("+1"))
phone = phone.Substring(2);
return Regex.Replace(phone, @"\D", string.Empty);
}
}
使用範例:
string[] phones = new[] {
"(708) 399 7222",
"7083997222",
"708-399-7222",
"708399-7222",
"+1 (708) 399-7222",
"+1 (708)399-7222"
};
string[] uniquePhones = phones.Distinct(new PhoneEqualityComparer()).ToArray();
這是一個非常整潔的正則表達式,它將取代:
一個空字符串
string text = Regex.Replace(inputString, @"\+\d+|[^0-9\r\n]", "" , RegexOptions.None | RegexOptions.Multiline);
輸入:
"(708) 399 7222"
"7083997222"
"708-399-7222"
"708399-7222"
"+1 (708) 399-7222"
"+1 (708)399-7222"
輸出:
7083997222
7083997222
7083997222
7083997222
7083997222
7083997222
首先刪除所有非數字字符,然後比較 –
@AmilWaduwawara OK 17083997222和7083怎麼樣? 997222.這些是相同的號碼,但前面的國家代碼會將其拋棄...... – Apollo
在一般情況下,您無法知道7085551212是否等同於自身,或者如果一個實例引用美國電話號碼, ,英國號碼。 – tripleee