C# LINQ可以用于搜索字符串中的多个正则表达式吗?

C# LINQ可以用于搜索字符串中的多个正则表达式吗?,c#,regex,linq,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 st

我有下面的代码可以工作,但我想使用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 }
列表过滤器=新列表();
Filters.Add(新的正则表达式(“string1”,RegexOptions.IgnoreCase));
Filters.Add(newregex(“string2”,RegexOptions.Compile));
...
bool found=false
string target=“可能包含string1或string2或两者都不包含的字符串”;
foreach(过滤器中的Regex r){
如果(r.IsMatch(目标)){
发现=真;
break;//一找到就马上出去
}
}
如果(找到){//do stuff}
搜索当前正在处理的大型文件需要很长时间。
有没有一种方法可以使.Any或.首先更有效地完成此操作?

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

仅出于演示目的,将您的样本模式与备选方案一起提供给优化器:
原始匹配模式:
string1 | string2
成为优化的匹配模式:
string[12]

  • 允许您在线执行相同的操作

也许你应该并行化你的代码(PLINQ)?Linq根本不会让你的代码更快,它只是隐藏了复杂性,如果你不熟悉它,它会引入一些可能导致更多cnfusion的东西——延迟执行。简而言之:不要为了优化而使用LINQ。话虽如此,您的代码已经尽可能快了,至少在您真正想使用regex时是如此。这是对regex引擎的低效使用。使用交替将两个正则表达式组合成一个正则表达式<代码>新正则表达式(“string1 | string2”)如果您有许多字符串,请使用此工具创建完整的正则表达式trie,这是人类已知的最快的搜索机制。它为所有emoji.Filters.Any(x=>x.IsMatch(target))??测试了
if(Filters.FirstOrDefault(x=>x.IsMatch(target))!=null)
这是一个统计关系。
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 }
}
use Regexp::Optimizer;
my $o  = Regexp::Optimizer->new->optimize(qr/foobar|fooxar|foozap/);
# $re is now qr/foo(?:[bx]ar|zap)/