高效地结合.Net Regex中的MatchCollections

Lar*_*mie 11 .net c# regex ienumerable

在简化的示例中,有2个正则表达式,一个区分大小写,另一个不区分大小写.这个想法是有效地创建一个IEnumerable集合(见下面的"组合")结合结果.

string test = "abcABC";
string regex = "(?<grpa>a)|(?<grpb>b)|(?<grpc>c)]";
Regex regNoCase = new Regex(regex, RegexOptions.IgnoreCase);
Regex regCase = new Regex(regex);

MatchCollection matchNoCase = regNoCase.Matches(test);
MatchCollection matchCase = regCase.Matches(test);

//Combine matchNoCase and matchCase into an IEnumerable
IEnumerable<Match> combined= null;
foreach (Match match in combined)
{
    //Use the Index and (successful) Groups properties 
    //of the match in another operation

}
Run Code Online (Sandbox Code Playgroud)

在实践中,MatchCollections可能包含数千个结果,并且使用长动态创建的REGEX经常运行,所以我想回避将结果复制到数组等.我仍在学习LINQ并且模糊了如何去做将这些或性能与已经缓慢的过程相结合将会是如此.

Rex*_*x M 18

这里有三个步骤:

  1. MatchCollection's 转换为IEnumerable<Match>'s
  2. 连接序列
  3. 根据Match.Success属性是否为true进行筛选

码:

IEnumerable<Match> combined = matchNoCase.OfType<Match>().Concat(matchCase.OfType<Match>()).Where(m => m.Success);
Run Code Online (Sandbox Code Playgroud)

这样做会创建一个新的枚举器,它只在获取下一个结果时执行每个步骤,因此您最终只能枚举每个集合一次,总计.例如,Concat()只会在第一个用完之后开始执行第二个枚举器.

  • 我认为.Concat()可能比.Union()更好,除非你有意避免结果重叠. (3认同)