簡體   English   中英

正則表達式性能很慢?

[英]Very slow regex perfomance?

我的應用程序運行緩慢,有時需要幾個小時才能恢復正常。 當我使用探查器時,我發現代碼占用大量時間,而正則表達式匹配發生的地方不過是什么。 任何人都可以指導我如何提高性能。 該代碼段如下所示

Regex rx = new Regex(@"^[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\@[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\.[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*$|^$");
rx.IsMatch("john.gilbert.stu.seattle.washington.us"); 

有什么辦法可以緩存模式並重用它?

您可以通過編譯和緩存來稍微提高RegEx的速度,但是很難解決您所擁有規模的性能問題。 即,一些需要O(n ^ 2)的慢速RegEx不會由於緩存/編譯或任何其他類型的自動處理而神奇地變為O(n)。

您需要檢查正則表達式並驗證每個正則表達式的執行次數。 最快的代碼是根本不需要運行的代碼-因此,如果有多余的匹配項,請先消除浪費的匹配項。 您可能需要切換到更合適的文本解析方式(例如,對RegEx進行HTML解析很可能是錯誤的方式-像HtmlAgilityPack這樣的良好HTML解析器與目標查詢結合使用可能更合適)。

如果字符串解析起來並不那么復雜,我只是將它們轉換為字符數組,然后自己解析。 它將大大提高性能。 RegEx的性能非常差。

for (int i = 0; i < string.Length; i++)
{
     if (string[i] has some defining quality)
         if (string[i] meets second requirement)
         // break, change flag, ect.
}

暫無
暫無

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

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