尝试在C#中使用命名组获得多个RegEx匹配项

时间:2016-05-11 19:11:38

标签: c# regex

我有一个像这样的字符串:

  

每个结算周期将使用80美元的住宅使用费,其中您的使用量介于1,000千瓦时和1,500千瓦时之间。每个结算周期将使用40美元的住宅使用信用额度,其中您的使用量介于1,501千瓦时和2,000千瓦时之间。

你可以看到这两个句子有重复的格式。我使用命名组创建了一个正则表达式,如下所示:

A Residential Usage (?<costType>[\w\s]+) of \p{Sc}*(?<cost>\s?\d+[., ]?\d*) will be applied for each billing cycle in which YOUR USAGE falls between (?<firstUsage>[0-9, ]+) kWh and (?<secondUsage>[0-9, ]+) kWh

我有很多这些字符串组合用于使用命名组进行正则表达式捕获,我使用此函数来捕获它们:

  public static string[] ValidatePattern(string pattern, string input, List<string> groupNames)
    {
        Regex regex = new Regex(pattern);
        var match = regex.Match(input);

        List<string> results = new List<string>();
        if (match.Success)
        {
            //results.Add(input);
            foreach (var name in groupNames)
            {
                if (match.Groups[name].Captures.Count > 0) results.Add(match.Groups[name].Value);
                else results.Add(String.Empty);
            }
            return results.ToArray();
        }
        return null;
    }

这适用于我目前的情况,因为对于我的大多数情况,我都没有像上面的例子那样重复它。但是,当我确实有一个断点并且看它是否捕获了两个匹配时,它只会在&#34;匹配&#34;上获得对象上的第一个(即本例中的1,000到1500)。宾语。

我的问题是,如何在Regex对象上获得第二场比赛?我可以从那里重构,但我不知道如何获取数据。

2 个答案:

答案 0 :(得分:3)

您需要遍历字符串的所有匹配项。 Regex.Match只会返回第一场比赛。

public static string[] ValidatePattern(string pattern, string input, List<string> groupNames)
{
    Regex regex = new Regex(pattern);
    var matches = regex.Matches(input);

    List<string> results = new List<string>();
    foreach (Match match in matches) {
        foreach (var name in groupNames)
        {
            var group = match.Groups[name];
            results.Add(group.Success ? group.Value : string.Empty);
        }
    }
    return results.ToArray();
}

答案 1 :(得分:1)

查看Regex.Match Method (String)处的示例,了解如何匹配字符串中的多个匹配项。我想你想要的是以下内容:

    while (match.Success)
    {
        //results.Add(input);
        foreach (var name in groupNames)
        {
            if (match.Groups[name].Captures.Count > 0) results.Add(match.Groups[name].Value);
            else results.Add(String.Empty);
        }
        match = match.NextMatch();
    }
    return results.Count > 0 ? results.ToArray() : null;

这会将if语句替换为while语句。