C# - 正则表达式验证所有电话号码?

时间:2017-05-23 10:38:16

标签: c# regex

我发现以下Regex验证所有可能的电话号码,并在this Regex validator上进行了测试:

^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$

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

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

列表Phones仍为空。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

您不仅要检查电话号码字符串表示是否有效,而且您希望在更大的字符串中找到它。这两个操作完全不同,因此应单独解决。不可能是一个完美的“一刀切”的正则表达式解决方案。如果有的话,Cultures在彼此之间无可比拟地失败并且他们真的不喜欢那样;)

理想情况下,您不应将所有这些数据都放在一个字符串中。字符串是自动格式最难的第二种(只有原始二进制文件更糟)。解析那些将是一个痛苦。至少,这些字符串应该在段或键/值对之间具有适当的逗号分隔。 如果您可以将源修改为更加自动化,请首先执行此操作。即使是一些XML输出或适当的CSV也会向上迈出一大步。

电话号码识别与任何其他号码识别一样:格式不固定,并且确实与文化一样多,与DateTime和其他数字一样:

步骤1应该是将这个大字符串拆分为以下的离散字符串段:

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

然后你可以思考解析每个字符串,包括电话号码。