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-6439095268621
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;
}