C#-Regex验证所有电话号码?

C#-Regex验证所有电话号码?,c#,regex,C#,Regex,我找到以下正则表达式来验证所有可能的电话号码,并在上进行了测试: 那么,为什么我在代码中使用它时,它与下面的数字不匹配 string text = "Herzeliya, Israel Tel: 972-52-2650599 Born 17/1/1975,"; List<string> Phones = new List<string>(); Regex phon1Regex = new Regex(@"^\s*(?:\+?(\d{1,3}))?([-. (]*(\d

我找到以下正则表达式来验证所有可能的电话号码,并在上进行了测试:

那么,为什么我在代码中使用它时,它与下面的数字不匹配

string text = "Herzeliya, Israel Tel: 972-52-2650599 Born 17/1/1975,";

List<string> Phones = new List<string>();

Regex phon1Regex = new Regex(@"^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$"); 
MatchCollection phon1Matches = phon1Regex.Matches(text);

foreach (Match phon1Match in phon1Matches) 
    Phones.Add(phon1Match.Value);
string text=“Herzeliya,以色列电话:972-52-2650599出生于1975年1月17日,”;
列表电话=新列表();
Regex phon1Regex=newregex(@“^\s*(?:\+?(\d{1,3}))?([-.(]*(\d{3})[-.]*)((\d{3})[-.]*(\d{2,4})(?:[-.x]*(\d+))\s*$”;
MatchCollection phon1Matches=phon1Regex.Matches(文本);
foreach(在phon1Match中匹配phon1Match)
电话。添加(phon1Match.Value);
电话列表保持为空


我在这里遗漏了什么?

您不仅要检查电话号码字符串表示形式是否有效,还需要在更大的字符串中找到它。这两个操作完全不同,因此应分别解决。不可能有一个完美的“一刀切”正则表达式解决方案。如果有的话,不同的文化在毫无用处地相互区别时失败了,他们真的不喜欢这样;)

理想情况下,您不应该在单个字符串中包含所有这些数据。字符串是第二难自动化的格式(只有原始二进制更差)。解析这些将是一件痛苦的事情。至少,这些字符串在段或键/值对之间应该有适当的逗号分隔。 如果您可以将源代码修改为更加自动化友好的,请先这样做。即使是一些XML输出或适当的CSV也将是一个巨大的进步

电话号码识别与任何其他号码识别一样:格式不是固定的,而且确实与日期时间和其他号码一样受文化的影响:

第1步应将此大字符串拆分为离散的字符串段,用于:

  • 地点(Herzeliya,以色列);也许城市和国家是分开的领域
  • 电话号码(972-52-2650599)
  • 出生日期(1975年1月17日)

然后,您可以考虑解析这些字符串中的每一个,包括电话号码。

您不仅要检查电话号码字符串表示形式是否有效,还要在更大的字符串中找到它。这两个操作完全不同,因此应分别解决。不可能有一个完美的“一刀切”正则表达式解决方案。如果有的话,不同的文化在毫无用处地相互区别时失败了,他们真的不喜欢这样;)

理想情况下,您不应该在单个字符串中包含所有这些数据。字符串是第二难自动化的格式(只有原始二进制更差)。解析这些将是一件痛苦的事情。至少,这些字符串在段或键/值对之间应该有适当的逗号分隔。 如果您可以将源代码修改为更加自动化友好的,请先这样做。即使是一些XML输出或适当的CSV也将是一个巨大的进步

电话号码识别与任何其他号码识别一样:格式不是固定的,而且确实与日期时间和其他号码一样受文化的影响:

第1步应将此大字符串拆分为离散的字符串段,用于:

  • 地点(Herzeliya,以色列);也许城市和国家是分开的领域
  • 电话号码(972-52-2650599)
  • 出生日期(1975年1月17日)

然后您可以考虑解析这些字符串中的每一个,包括电话号码。

锚-删除
^
$
。请看。@WiktorStribiżew正在测试它……谢谢@WiktorStribiżew。你想把这个作为一个答案吗?事实上,我认为这个模式需要修剪一下。您没有使用它的任何捕获,对吗?此外,您可能对提取像
这样的数字不感兴趣<代码>\d
匹配它们。@WiktorStribiżew你什么意思?没有将您带到那里。锚-删除
^
$
。请看。@WiktorStribiżew正在测试它……谢谢@WiktorStribiżew。你想把这个作为一个答案吗?事实上,我认为这个模式需要修剪一下。您没有使用它的任何捕获,对吗?此外,您可能对提取像
这样的数字不感兴趣<代码>\d
匹配它们。@WiktorStribiżew你什么意思?我没带你去。
string text = "Herzeliya, Israel Tel: 972-52-2650599 Born 17/1/1975,";

List<string> Phones = new List<string>();

Regex phon1Regex = new Regex(@"^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$"); 
MatchCollection phon1Matches = phon1Regex.Matches(text);

foreach (Match phon1Match in phon1Matches) 
    Phones.Add(phon1Match.Value);