C# 尝试在C中获取多个与命名组匹配的正则表达式#

C# 尝试在C中获取多个与命名组匹配的正则表达式#,c#,regex,C#,Regex,我有一根像这样的线: 在您的使用量介于1000 kWh和1500 kWh之间的每个计费周期,将申请80美元的住宅使用信用。在您的使用量介于1501 kWh和2000 kWh之间的每个计费周期内,将申请40美元的住宅使用额度 你可以看到这两句话的格式是重复的。我使用命名组创建了一个正则表达式,如下所示: A Residential Usage (?<costType>[\w\s]+) of \p{Sc}*(?<cost>\s?\d+[., ]?\d*) will be ap

我有一根像这样的线:

在您的使用量介于1000 kWh和1500 kWh之间的每个计费周期,将申请80美元的住宅使用信用。在您的使用量介于1501 kWh和2000 kWh之间的每个计费周期内,将申请40美元的住宅使用额度

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

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
p{Sc}*(?\s?\d+[,]?\d*)的住宅使用量(?[\w\s]+)将应用于您的使用量介于(?[0-9,]+)kWh和(?[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;
    }
publicstaticstring[]ValidatePattern(字符串模式、字符串输入、列表组名)
{
正则表达式正则表达式=新正则表达式(模式);
var match=regex.match(输入);
列表结果=新列表();
如果(匹配成功)
{
//结果。添加(输入);
foreach(groupNames中的变量名)
{
如果(match.Groups[name].Captures.Count>0)结果。添加(match.Groups[name].Value);
else results.Add(String.Empty);
}
返回结果。ToArray();
}
返回null;
}
这在我目前的情况下效果很好,对于我的大多数场景,我没有像上面的例子那样重复它。但是,当我有一个断点并查看它是否捕获了两个匹配项时,它只获取对象上的第一个断点(即本例中的1000到1500),即“match”对象上的断点


我的问题是,如何获得Regex对象的第二个匹配?我可以从那里重构,但我不知道如何获取数据

您需要遍历字符串的所有匹配项
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();
}
publicstaticstring[]ValidatePattern(字符串模式、字符串输入、列表组名)
{
正则表达式正则表达式=新正则表达式(模式);
var matches=regex.matches(输入);
列表结果=新列表();
foreach(匹配中的匹配){
foreach(groupNames中的变量名)
{
var group=match.Groups[name];
结果.Add(group.Success?group.Value:string.Empty);
}
}
返回结果。ToArray();
}
查看上的示例,了解如何匹配字符串中的多个匹配项。我想你想要的是:

    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;

这将用
while
语句替换
if
语句。

match.Groups[name].Captures[0]是第一个匹配项,match.Groups[name].Captures[1]是第二个。嗯,我尝试了在Captures集合中循环,只得到了一个结果。那么您的表达式上一定有错误,用类似regex coachThanks的东西检查一下!我试试看。