如何将相同的Regex匹配组合起来?

时间:2016-11-17 20:55:34

标签: c# regex

如果我想使用正则表达式查找字符串中括号内的所有文本,我会这样:

string text = "[the] [quick] brown [fox] jumps over [the] lazy dog";
Regex regex = new Regex(@"\[([^]]+)\]");
MatchCollection matches = regex.Matches(text);

foreach (Match match in matches)
{
    ... // Here is my problem!
}

我不确定如何从此处继续我的代码,如果我只是遍历所有匹配项,我会得到"the""quick""fox""the",我希望将两个the分组在同一个Match.Group中,只是在不同的索引处。

真正想要的是让两个"the"以这样的方式分组,我可以找到所有出现的同一个词及其索引。 < / p>

我希望API会给我这样的东西:

foreach (Match match in matches)
{   
    for (int i = 1; i < match.Groups.Count; i++)
    {
        StartIndexesList.Add(match.Groups[i].Index);
    }
}

每个match.Group将在某个找到的令牌的文本中保存对同一事件的引用,所以我希望此代码会立即将所有the文本索引引用添加到列表中,但是它没有,它只是为每个单独的事件添加,而不是一次性添加。

如果没有对所有令牌进行后期处理以查看是否有重复的令牌,我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:1)

这是你在找什么?

string text = "[the] [quick] brown [fox] jumps over [the] lazy dog";
Regex regex = new Regex(@"\[([^]]+)\]");
MatchCollection matches = regex.Matches(text);

foreach (IGrouping<string, Match> group in matches.Cast<Match>().GroupBy(_ => _.Value))
{
    Console.WriteLine(group.Key);   // This will print '[the]'

    foreach (Match match in group)  // It will iterate through all matches of '[the]'
    {
        // do your stuff
    }
}