我发现以下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
仍为空。
我在这里缺少什么?
答案 0 :(得分:3)
您不仅要检查电话号码字符串表示是否有效,而且您希望在更大的字符串中找到它。这两个操作完全不同,因此应单独解决。不可能是一个完美的“一刀切”的正则表达式解决方案。如果有的话,Cultures在彼此之间无可比拟地失败并且他们真的不喜欢那样;)
理想情况下,您不应将所有这些数据都放在一个字符串中。字符串是自动格式最难的第二种(只有原始二进制文件更糟)。解析那些将是一个痛苦。至少,这些字符串应该在段或键/值对之间具有适当的逗号分隔。 如果您可以将源修改为更加自动化,请首先执行此操作。即使是一些XML输出或适当的CSV也会向上迈出一大步。
电话号码识别与任何其他号码识别一样:格式不固定,并且确实与文化一样多,与DateTime和其他数字一样:
步骤1应该是将这个大字符串拆分为以下的离散字符串段:
然后你可以思考解析每个字符串,包括电话号码。