正则表达式C# - 获取文本中的所有匹配项

时间:2017-07-18 13:12:58

标签: c# .net regex

我正在尝试从字符串中获取所有电话号码,但我只获得第一次。我无法在这里或其他任何地方找到能解决我问题的任何东西。请看一下我的代码:

List<string> phones = new List<string>();
String test = @"+49 30 12345-67
                        +49 30 1234567
                        +49(30)1234567
                        +49 (30) 12345 - 67
                        +49-30-1234567
                        +49 (0)30 12345-67
                        +49 383 239823
                        +49 (0)42 3298280
                        dkfdklfsjd 393292
                        39239 ";
        const string MatchEmailPattern1 = @"(^\+49)([ \-\(]{1,2}[0-9]{1,6}[ \-\)]{1,2})?([0-9 \.\-\/]{3,20})?";
        var patterns = new string[] { MatchEmailPattern1 };
        Regex r1 = new Regex(string.Join("|", patterns), RegexOptions.Compiled | RegexOptions.IgnoreCase);
        MatchCollection matches1 = r1.Matches(test);
        StringBuilder sb = new StringBuilder();
        foreach (Match match in matches1)
        {
            StringBuilder ph = new StringBuilder(match.Value);
            phones.Add(ph.ToString());                
            Console.WriteLine(String.Join(",", phones));
        }

1 个答案:

答案 0 :(得分:3)

您需要删除字符串锚^的开头。此外,还有一种方法可以删除角色类中的一些冗余转义。

使用

@"(\+49)([- (]{1,2}[0-9]{1,6}[- )]{1,2})?([0-9 ./-]{3,20})?"

请参阅regex demo

请注意,[- (]匹配单个字符,-,空格或(。无需在字符类的开头(或结尾)转义-。或者,如果您计划进一步扩展模式,请保持连字符转义以避免在其他开发人员在其之前或之后添加字符时出现问题。