2014-04-26 107 views
1

檢查不同格式電話號碼的最佳方法是什麼?檢查電話號碼是否等同

不同的格式:

「(708)399 7222」

「7083997222」

「708-399-7222」

「708399-7222」

「 +1(708)399-7222「

」+1(708)399-7222「

其他難度:如果電話號碼不是國家代碼的前綴,該怎麼辦?

+1

首先刪除所有非數字字符,然後比較 –

+1

@AmilWaduwawara OK 17083997222和7083怎麼樣? 997222.這些是相同的號碼,但前面的國家代碼會將其拋棄...... – Apollo

+0

在一般情況下,您無法知道7085551212是否等同於自身,或者如果一個實例引用美國電話號碼, ,英國號碼。 – tripleee

回答

1

不能使用一個正則表達式。要獲得可以比較的規範表示形式:

  1. 用您的international call prefix代替首字母+。在許多國家,這是00
  2. 如果號碼不是以前綴開頭,請爲您的國家添加前綴和國家/地區代碼。
  3. 刪除所有非數字。

如果您只需處理來自單個國家的呼叫,例如您正在爲電話公司的內部使用開發某些內容,這就足夠了。如果你不得不接受來自不同國家的各種各樣的輸入和不同的前綴,我建議找一個經過良好測試的庫來做到這一點。

+1

00無處不在。在我住的地方,美國的電話號碼看起來像990 1 708 555 1212.儘管如此,大多數人都會用+1來寫。 – tripleee

+0

確實。 '+'是**正確的**前綴,因爲它已被全球所有電信提供商和監管機構所認可。 – ClickRick

+0

謝謝,我只有那些00被認爲是前綴的國家的經驗。你能否確認所有電話運營商都將翻譯成正確的前綴? http://en.m.wikipedia.org/wiki/List_of_international_call_prefixes似乎暗示它僅適用於手機網絡 – Joni

0

試試這個正則表達式

\(?\d{3}\)?-? *\d{3}-? *-?\d{4} 

或者:

^\+?(\d[\d-]+)?(\([\d-.]+\))?[\d-]+\d$ 

Regex Demo

+0

是否可以處理一個版本的電話號碼包含國家/地區代碼的可能性,但另一個版本可能不會? – Apollo

+0

@Auser我已經更新瞭解決方案。請看看我的解決方案 –

0

您可以實現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(); 
0

這是一個非常整潔的正則表達式,它將取代:

  • 任何加號後跟一個或多個數字
  • 任何不是數字或換行符的字符

一個空字符串

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 
+0

如果國家/地區代碼未與其他編號分開,則會丟棄所有內容。 – tripleee

+0

國家代碼總是一位數字?或者它總是由一個空格或一個括號分開?如果有更多測試輸入,則應將其添加到測試用例:) – Derek

+0

國家/地區代碼最多可以有3位數字,並且可以使用數字前綴而不是「+」。 – Joni