我有以下代码可以使用,但是想使用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更有效地完成这项工作?
答案 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模块来自动完成它:
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]
。