關於正規表示式匹配無異常資源耗盡的解決方案

2021-04-13 08:23:37 字數 1241 閱讀 5964

在c#中使用正規表示式進行匹配,有時候我們會遇到這種情況,cpu使用率100%,但是正規表示式並沒有異常丟擲,正則一直處於匹配過程中,這將導致系統資源被耗盡,應用程式被卡住,這是由於正則不完全匹配,而且regex中沒有timeout屬性,使正則處理器陷入了死迴圈。

這種情況尤其可能發生在對非可靠的被匹配物件的匹配過程中,例如在我的個人**http://www.eahan.com專案中,對多個**頁面的自動採集匹配,就經常發生該問題。為了避免資源耗盡的情況發生,我寫了乙個asynchronousregex類,顧名思義,非同步的regex。給該類乙個設定乙個timeout屬性,將regex匹配的動作置於單獨的執行緒中,asynchronousregex監控regex匹配超過timeout限定時銷毀執行緒。 

using system;

using system.text.regularexpressions;

using system.threading;

namespace lzt.eahan.common

}public asynchronousregex(int timeout)

public matchcollection matchs(regex regex, string input)

private void sleep(thread t)

else}}

private void matchcompletehandler(matchcollection mc)

class reg

private string _input;

public string input

set

}private regex _regex;

public regex regex

set

}internal void matchs()}}

}}呼叫 asynchronousregex ar = new asynchronousregex(1000); //1000是設定1000為超時時限

matchcollection mc = ar.matchs(new regex(regular), input); //regular是正規表示式,inupt是要被匹配的字串

Python正規表示式關於匹配「 」

import re s t123 pattern t d o re.match pattern,s print o 輸出是 none 因為在pattern中,同樣作為了轉義,所以想要匹配兩個 就需要四個 pattern t d 這樣即可匹配成功 如果我們的字串s中有四個 呢?那麼我們在pattern...

關於正規表示式 匹配規則

基本模式匹配 一切從最基本的開始。模式,是正規表示式最基本的元素,它們是一組描述字串特徵的字元。模式可以很簡單,由普通的字串組成,也可以非常複雜,往往用特殊的字元表示乙個範圍內的字元 重複出現,或表示上下文。例如 once 這個模式包含乙個特殊的字元 表示該模式只匹配那些以once開頭的字串。例如該...

正規表示式 匹配

字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...