检查电话号码是否相等

时间:2014-04-26 06:11:38

标签: regex

检查不同格式的电话号码以确定等效的最佳方式是什么?

不同的格式:

"(708)399 7222"

" 7083997222"

" 708-399-7222"

" 708399-7222"

" +1(708)399-7222"

" +1(708)399-7222"

其他问题:如果电话号码不是以国家/地区代码开头会怎么样?

4 个答案:

答案 0 :(得分:1)

您不能使用单个正则表达式。获得可比较的规范表示:

  1. international call prefix替换初始值+。在许多国家/地区,这是00
  2. 如果号码不以前缀开头,请添加您所在国家/地区的前缀和国家/地区代码。
  3. 删除所有非数字。
  4. 如果您只需要处理来自单个国家/地区的电话,这就足够了,例如,如果您正在开发一些供电话公司内部使用的电话。如果您必须接受来自不同国家/地区的各种前缀的广泛输入,我建议您找一个经过良好测试的库来执行此操作。

答案 1 :(得分:0)

试试这个正则表达式

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

或者:

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

<强> Regex Demo

答案 2 :(得分: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();

答案 3 :(得分: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