2014-04-26 109 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