可以使用LINQ在字符串中搜索多个Regex表达式吗?

时间:2018-05-05 18:27:48

标签: c# regex linq

我有以下代码可以使用,但是想使用LINQ(或其他东西)加速查找是否有任何正则表达式搜索字符串在目标中。

List<Regex> Filters = new List<Regex>();
Filters.Add(new Regex("string1", RegexOptions.IgnoreCase));
Filters.Add(new Regex("string2", RegexOptions.Compile));
...
bool found = false
string target = "string which may contain string1 or string2 or neither";
foreach (Regex r in Filters) {
   if (r.IsMatch(target)) {
       found = true;
       break; // get out as soon as found
   }
}
if (found) { // do stuff }

目前正在搜索大型文件需要很长时间。 有没有办法让.Any或.First更有效地完成这项工作?

1 个答案:

答案 0 :(得分:3)

正如所暗示的,使用LinQ进行最简单的简化可以通过All(要求满足所有条件)或Any(以||方式连接正则表达式条件)来实现。

List<Regex> Filters = new List<Regex>();
Filters.Add(new Regex("string1", RegexOptions.IgnoreCase, RegexOptions.Compiled));
Filters.Add(new Regex("string2", RegexOptions.Compiled));
string target = "string which may contain string1 or string2 or neither";
if (Filters.Any(x => x.IsMatch(target)))
{
    // do stuff }
}

但是,如果要混合All/Any,您可能需要考虑编写自己的扩展方法,将两者结合起来以避免多次评估输入。 @jonskeet有一个简洁的例子here

尽管如此,可能通过组合和优化正则表达式模式可以获得最大的收益。手动优化的模式通常是最好的,但您可以尝试使用以下两个Perl模块来自动完成它:

  • Dan Kogai的Regexp-Optimizer-0.23优化/组装模式
use Regexp::Optimizer;
my $o  = Regexp::Optimizer->new->optimize(qr/foobar|fooxar|foozap/);
# $re is now qr/foo(?:[bx]ar|zap)/

仅出于演示目的,将您的样本模式替换为优化器:
原始匹配模式:string1|string2成为优化匹配模式:string[12]