使用正则表达式标准化电话号码

时间:2012-06-26 06:34:50

标签: c# regex phone-number

我有一个未经验证的用户输入的电话号码列表,它们看起来像:

 - 495) 995-0595
 - 105-6439
 - 095 268 8621
 - 324-51-44
 - 7 (495) 995-05-95
 - 7 495 995 05 95
 - 7 (495) 995-0595
 - +7 (495) 995-05-95
 - 7 (495)925-34-89
 - 7(495)9253489
 - 7(495)925-34-89
 - 74959950595

我想将这些数字转换为此(俄语)格式: + X(XXX)XXX-XX-XX

有没有机会使用正则表达式实现它?

5 个答案:

答案 0 :(得分:3)

Yup,Extract&重新格式化!

List<string> oldlist = new List<string>();
List<string> newlist = new List<string>();
foreach(string s in oldlist)
{
     if(s.Contains('(')) s = s.Replace('('), "");//etc
     newlist.Add(numFormat(s));
}

string prefix = "495";

string numFormat(string s)
{
     string my;
     if(s.Length == 7)
     {
         my = string.Format("+7 ({0}) {1} {2} {3}", prefix, s.substring(0,3), s.subtring(3,2), s.substring(5,2);
     }
     else if(s.length == 10)
     {
         my = string.Format("+7 ({0}) {1} {2} {3}", s.substring(0,3), s.substring(3,3), s.subtring(5,2), s.substring(7,2);        
     }
     //etc
     return my;
}

这只是我的头脑......但你明白了

答案 1 :(得分:2)

通过以下方式运行您的列表:

var strippedNumbers = new List<string>();
foreach (var num in listOfRussianNumbers.Select(x=>Regex.Replace(x, "[^0-9]", ""))) 
    strippedNumbers.Add(num.Length == 7?"7499"+num:num);

然后使用string.Format打印出你想要的方式

string.Format("+{0} ({1}) {2}-{3}-{4}", 
    num.Substring(0,1), 
    num.Substring(1,3),
num.Substring(4,3),
num.Substring(7,2),
num.Substring(9,2));

答案 2 :(得分:1)

我认为你应该这样做

  1. 将其转换为字符串。
  2. 使用循环删除任何看起来不像数字的内容。您可以使用Char.IsDigit()
  3. 然后使用string.Substring()
  4. 进行所需的格式设置

    确保仅以字符串格式执行所有这些步骤。

    string str = "495) 995-0595";
    List<char> digits = new List<char>();
    
    for (int i = 0; i < str.Length; i++)
    {
        if(char.IsDigit(str[i]))
            digits.Add(str[i]);
    }
    
    str = new string(digits.ToArray());
    
    str = "+" + str.Substring(0, 1) + " (" + str.Substring(1, 3) + ") " 
          + str.Substring(4, 2) + "-" + str.Substring(6, 2) + "-" + str.Substring(8);
    

    这回复了我"+4 (959) 95-05-95"

答案 3 :(得分:1)

这是我能在短时间内得到的最好的。

((\+?\d)\s?)?\(?(\d\d\d)\)?\s?(\d\d\d)(\s|-)?(\d\d)(\s|-)?(\d\d)

这将从您的样本中选择粗体。

495)995-0595
105-6439
095 268 8621
324-51-44
7(495)995-05-95
7 495 995 05 95
7(495)995-0595
+7(495)995-05-95
7(495)925-34-89
7(495)9253489
7(495)925-34-89
74959950595

在不匹配的字符串上,您可以通过不同的例程发送它们或进行手动处理。

答案 4 :(得分:0)

类似的东西:

(\d)? ?\(?(\d\d\d)?\)? *?(\d\d\d) *?-? *?(\d\d) *?-? *?(\d\d)