我有一个像这样的字符串:
每个结算周期将使用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对象上获得第二场比赛?我可以从那里重构,但我不知道如何获取数据。
答案 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
语句。