我有以下有效的代码,但想使用LINQ(或其他方法)加快速度,以查找目标中是否有任何Regex搜索字符串。
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更有效地完成呢?
如所暗示的,可以通过All
(要求满足所有条件)或Any
(以某种||
方式连接正则表达式条件)来实现使用LinQ最简单的简化。
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在这里有一个很好的例子。
尽管如此,通过组合和优化您的正则表达式模式,可能会获得最大的收益。手动优化模式通常是最好的,但是您可以尝试以下两个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]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句