簡體   English   中英

可以使用LINQ在字符串中搜索多個Regex表達式嗎?

[英]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模塊來自動完成它:

  • 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM