C# 使用regex规范化电话号码

C# 使用regex规范化电话号码,c#,regex,phone-number,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 我想将这些数字转换

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

 - 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


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

我认为您应该这样做

  • 将其转换为字符串
  • 使用循环删除任何看起来不像数字的内容。您可以使用
    Char.IsDigit()
    进行此操作
  • 然后使用
    string.Substring()
    执行所需的格式设置
  • 确保仅以字符串格式执行所有这些步骤

    string str=“495)995-0595”;
    列表位数=新列表();
    对于(int i=0;i
    这让我返回了+4(959)95-05-95“

    类似的内容:

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

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

    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);
    

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

    ((\+?\d)\s?)?\(?(\d\d\d)\)?\s?(\d\d\d)(\s|-)?(\d\d)(\s|-)?(\d\d)
    
    这将从您的示例中选择粗体

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


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

    是的,提取并重新格式化

    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;
    }
    
    List oldlist=新列表();
    List newlist=新列表();
    foreach(oldlist中的字符串s)
    {
    如果(s.Contains(“(”)s=s.Replace(“(”),”“);//等
    添加(numFormat(s));
    }
    字符串前缀=“495”;
    字符串numFormat(字符串s)
    {
    系上我的绳子;
    如果(s.Length==7)
    {
    my=string.Format(“+7({0}){1}{2}{3}”),前缀,s.substring(0,3),s.substring(3,2),s.substring(5,2);
    }
    否则,如果(s.length==10)
    {
    my=string.Format(“+7({0}){1}{2}{3}”、s.substring(0,3)、s.substring(3,3)、s.substring(5,2)、s.substring(7,2);
    }
    //等
    归还我的;
    }
    

    这是我脑子里想不出来的…但是你明白了这个想法

    我想你应该在用户输入数据时进行验证。看起来你只有两种情况,7位和11位。除了格式设置,你首先会从列表中删除所有格式,并存储为纯数字。然后用string.fo按你想要的方式格式化它你怎么知道对于像
    105-6439
    324-51-44
    这样的短数字,在缺少的字段中放什么?我们可以假设它们都是
    +7(495)
    …?并且是一个前导的
    095
    +7(495)
    的缩写吗?我猜这些数字都在某种数据库中。我没有看到任何其他解决方案“规范化”它们:提取数字,并根据您的俄语电话号码格式重新格式化。如果我有105-6439或324-51-44这样的号码,我必须使用莫斯科国际代码(499)进行格式化。问题是495中缺少的那一轮密码)定义城市代码。因此,我还必须修复此缺失,以获取XXX XX XXi中的电话号码。我想你会在Nikhil和我的解决方案中发现,我们忽略了所有错误的格式。剥离格式比“修复”格式容易得多。只需获取号码,然后以正确的格式覆盖它。不要考虑trying要修复每个单独的格式大小写,有无限可能出现不好的情况。最后3个必须是
    num.Substring(4,2),num.Substring(6,2),num.Substring(8,2));
    no,我想你缺少第一个数字,所以你所有的字符串都有1个字符:)
    ((\+?\d)\s?)?\(?(\d\d\d)\)?\s?(\d\d\d)(\s|-)?(\d\d)(\s|-)?(\d\d)
    
    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;
    }