检查不同格式电话号码的最佳方法是什么?检查电话号码是否等同
不同的格式:
“(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