[英]Can LINQ be used to search for multiple Regex expressions in a string?
我有以下代碼可以工作,但希望使用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更有效地完成這項工作?
作為暗示,使用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 在這里有一個很好的例子。
盡管如此,可能通過組合和優化正則表達式模式可以獲得最大的收益。 手動優化的模式通常是最好的,但您可以嘗試使用以下兩個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]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.