專利名稱:一種正則表達(dá)式匹配的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,具體地涉及一種正則表達(dá)式匹配的方法及裝置。
背景技術(shù):
正則表達(dá)式(Regular Expression)是一種用來(lái)描述特定字符串的工具。其語(yǔ)法 豐富,可以準(zhǔn)確而靈活地描述各種復(fù)雜特征的字符串。正則表達(dá)式引擎則可以根據(jù)正則表 達(dá)式描述的特征,從給定的字符串集合中找出符合該特征的字符串子集。正則表達(dá)式引擎有非常廣泛的用途,例如文本的查找替換,文件檢索等。完成特定 內(nèi)容識(shí)別過(guò)濾,網(wǎng)絡(luò)監(jiān)聽(tīng),協(xié)議識(shí)別,流量偵測(cè)和流量控制,攻擊防護(hù),病毒檢測(cè),定向廣告 推送等功能。通常可以把正則表達(dá)式編譯生成NFA(Nondeterministic Finite Automaton,非 確定性有限自動(dòng)機(jī))或DFA (Deterministic Finite Automaton,確定性有限自動(dòng)機(jī)),再用 軟件或硬件實(shí)現(xiàn)NFA引擎,然后用這個(gè)NFA引擎根據(jù)前面編譯出來(lái)的NFA數(shù)據(jù)去查找待匹 配的報(bào)文。發(fā)明人在實(shí)現(xiàn)本發(fā)明的過(guò)程中發(fā)現(xiàn),現(xiàn)有技術(shù)至少存在以下不足NFA引擎以正則表達(dá)式為主導(dǎo),查找時(shí)需要回溯,所以它可能多次取同一數(shù)據(jù)跟正 則表達(dá)式的不同部分比較。因此,在需要回溯的情況下它的執(zhí)行速度可能非常慢。因?yàn)镈FA表在規(guī)則比較復(fù)雜時(shí)(比如有多個(gè).*)的情況,其中.表示任意字符,* 表示出現(xiàn)任意次數(shù),該DFA表項(xiàng)比較大,占用大量的儲(chǔ)存空間,所以DFA引擎在處理這種DFA 表時(shí)匹配速度也會(huì)比較慢。大量的正則表達(dá)式一起編譯,儲(chǔ)存空間會(huì)達(dá)到GB級(jí)別。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供一種正則表達(dá)式匹配方法及裝置,以獲得更快的匹配速度,并 降低DFA表項(xiàng)所占用的存儲(chǔ)空間。一方面,本發(fā)明實(shí)施例提供了一種正則表達(dá)式匹配的方法,包括輸入待匹配報(bào)文 及確定性有限自動(dòng)機(jī)DFA狀態(tài)表,所述DFA狀態(tài)表包括狀態(tài)遷移表,所述狀態(tài)遷移表中包括 正則表達(dá)式匹配過(guò)程中的所有狀態(tài)地址和各個(gè)狀態(tài)之間的遷移關(guān)系,所述遷移關(guān)系包括匹 配條件及符合匹配條件的下一狀態(tài);判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型,所述數(shù)據(jù)類型包括單 個(gè)字符Char型和多個(gè)字符Str型,所述Str型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)的多個(gè)字符;如果當(dāng)前狀 態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Str型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的多個(gè)字符值與匹配條件進(jìn)行匹 配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài);如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是 Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷 移至所述符合匹配條件的下一狀態(tài);當(dāng)所述下一狀態(tài)為接受態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹 配成功結(jié)果。另一方面,本發(fā)明實(shí)施例提供了一種正則表達(dá)式匹配的裝置,包括報(bào)文及DFA表 載入單元,用于輸入待匹配報(bào)文及確定性有限自動(dòng)機(jī)DFA狀態(tài)表,所述DFA狀態(tài)表包括狀態(tài)CN 102142009 A
說(shuō)明書
2/14 頁(yè)
遷移表,所述狀態(tài)遷移表中包括正則表達(dá)式匹配過(guò)程中的所有狀態(tài)地址和各個(gè)狀態(tài)之間的 遷移關(guān)系,所述遷移關(guān)系包括匹配條件及符合匹配條件的下一狀態(tài);查找單元,包括數(shù)據(jù)類 型確定模塊、匹配模塊及輸出模塊;所述數(shù)據(jù)類型確定模塊,用于判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù) 類型,所述數(shù)據(jù)類型包括單個(gè)字符Char型和多個(gè)字符Str型,所述Str型對(duì)應(yīng)的數(shù)據(jù)為連 續(xù)的多個(gè)字符;所述匹配模塊,用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Str型,則將待匹配報(bào) 文中當(dāng)前狀態(tài)的多個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條 件的下一狀態(tài);如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的單 個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài);所述 輸出模塊,用于當(dāng)所述下一狀態(tài)為接受態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配成功結(jié)果。本發(fā)明實(shí)施例的有益效果在于本發(fā)明實(shí)施例提供的正則表達(dá)式的匹配方法,通 過(guò)將待匹配數(shù)據(jù)的數(shù)據(jù)類型分為Char型和Str型,并根據(jù)不同的數(shù)據(jù)類型分別執(zhí)行不同的 匹配處理過(guò)程。對(duì)于Str型數(shù)據(jù),是當(dāng)該Str型所包含的多個(gè)字符全部匹配成功后才遷移 到下一狀態(tài),從而節(jié)省了遷移邊,使?fàn)顟B(tài)遷移表需要記錄的狀態(tài)減少,可以極大地減小狀態(tài) 遷移表所占用的儲(chǔ)存空間,并提高匹配速度與匹配效率。
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn) 有技術(shù)描述中所需要使用的附圖做一簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是 本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還 可以根據(jù)這些附圖獲得其他的附圖。圖1為本發(fā)明實(shí)施例1的正則表達(dá)式匹配方法的整體流程圖;圖IA為本發(fā)明實(shí)施例1作為一個(gè)舉例的編譯成DFA表后各個(gè)狀態(tài)間的關(guān)系示意 圖;圖2為本發(fā)明實(shí)施例1的作為一個(gè)舉例的字符映射表的數(shù)據(jù)結(jié)構(gòu)示意圖;圖3為本發(fā)明實(shí)施例1的一種狀態(tài)屬性表的結(jié)構(gòu)示意圖;圖4為本發(fā)明實(shí)施例1的狀態(tài)遷移表的結(jié)構(gòu)示意圖;圖4A為本發(fā)明實(shí)施例1圖4的狀態(tài)遷移表中Str型屬性數(shù)據(jù)結(jié)構(gòu)的示意圖;圖4B為本發(fā)明實(shí)施例1圖4的狀態(tài)遷移表中Rep型屬性數(shù)據(jù)結(jié)構(gòu)的示意圖;圖5為本發(fā)明實(shí)施例1作為又一個(gè)舉例的字符映射表的結(jié)構(gòu)示意圖;圖6為本發(fā)明實(shí)施例1作為舉例的一個(gè)狀態(tài)屬性表的示意圖;圖7為本發(fā)明實(shí)施例1的作為一個(gè)舉例的狀態(tài)遷移表的示意圖;圖8為本發(fā)明實(shí)施例2的正則表達(dá)式匹配裝置的功能框圖;圖9為本發(fā)明實(shí)施例2的圖8所示正則表達(dá)式匹配裝置的工作流程圖;圖10為本發(fā)明實(shí)施例2的圖8所示的查找單元的詳細(xì)工作流程圖。
具體實(shí)施例方式為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例 中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是 本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。需要說(shuō)明的是,由于本發(fā)明實(shí)施例使用的DFA表是一種由正則表達(dá)式編譯出來(lái)的 二進(jìn)制數(shù)據(jù),所以可以查找的數(shù)據(jù)包括所有可以用二進(jìn)制表示的內(nèi)容,例如純粹的二進(jìn)制 ^iiS ^HfW^ !^ ^ (American Standard Code for Information Interchange, ASCII),統(tǒng)一碼(UNICODE)等等。而這些格式的數(shù)據(jù)都可能出現(xiàn)在現(xiàn)有的報(bào)文里面,為了簡(jiǎn) 化起見(jiàn),以下將待查找或匹配的數(shù)據(jù)簡(jiǎn)稱為報(bào)文。而一個(gè)字節(jié)的二進(jìn)制數(shù)據(jù)總能用一個(gè)等 效的字符表示(不管是否可打印字符),所以本發(fā)明實(shí)施例中把待查找數(shù)據(jù)中的單字節(jié)數(shù) 據(jù)簡(jiǎn)稱為字符,多個(gè)單字節(jié)數(shù)據(jù)組合在一起稱為字符串。實(shí)施例1 本發(fā)明實(shí)施例1提供了一種正則表達(dá)式匹配的方法。圖1為本發(fā)明實(shí)施例1的正 則表達(dá)式匹配方法的整體流程圖。如圖1所示,該方法的執(zhí)行主體是本發(fā)明實(shí)施例提供的 一種正則表達(dá)式匹配裝置,該方法包括如下步驟步驟100、載入待匹配報(bào)文及確定性有限自動(dòng)機(jī)DFA狀態(tài)表,該DFA狀態(tài)表包括狀 態(tài)遷移表,該狀態(tài)遷移表中包括正則表達(dá)式匹配過(guò)程中的所有狀態(tài)地址和各個(gè)狀態(tài)之間的 遷移關(guān)系,上述遷移關(guān)系包括匹配條件及符合匹配條件的下一狀態(tài)。上述的地址是指某個(gè) 狀態(tài)所對(duì)應(yīng)的數(shù)據(jù)在存儲(chǔ)介質(zhì),例如緩存,中儲(chǔ)存的起始位置。步驟102、判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型,數(shù)據(jù)類型包括單個(gè)字符型(character 型,簡(jiǎn)稱為Char型)和多個(gè)字符型(string型,簡(jiǎn)稱為Str型),Str型對(duì)應(yīng)的數(shù)據(jù)為連續(xù) 的多個(gè)字符。如果為Str型,執(zhí)行步驟104,如果為Char型,執(zhí)行步驟106。具體地,以下舉例說(shuō)明Char型和Str型。例如,對(duì)于正則表達(dá)式/teSt\S*abC/ (兩個(gè)“/”之間的部分表示正則表達(dá)式,以下同),第一個(gè)字符t總是分類為Char型,est為 連續(xù)出現(xiàn)的多個(gè)字符,分類為Str型,通配符“\s*”表示“空格”、“回車”、“下一行”出現(xiàn)一 次、一次以上的任意次數(shù)或者不出現(xiàn),即出現(xiàn)的次數(shù)不確定,則將位于報(bào)文中間的出現(xiàn)次數(shù) 不確定的單個(gè)字符分類為Char型,abc為連續(xù)出現(xiàn)且不重復(fù)的多個(gè)字符,分類為Str型。步驟104、如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Str型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的 多個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài)。步驟106、如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài) 的單個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài)。步驟108、當(dāng)所述下一狀態(tài)為接受態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配成功結(jié)果。以下對(duì)本發(fā)明實(shí)施例中的“當(dāng)前狀態(tài)”和“下一狀態(tài)”進(jìn)一步進(jìn)行詳細(xì)說(shuō)明。為了 便于理解,直接使用字符作為遷移條件,此外,以下將本發(fā)明實(shí)施例的正則表達(dá)式匹配裝置 簡(jiǎn)稱為引擎。例如正則表達(dá)式廠AB/,表示的匹配條件是待匹配數(shù)據(jù)的第一個(gè)字節(jié)必須是大 寫字母A,第二個(gè)字節(jié)是大寫字母B,才能匹配成功;否則匹配失敗。編譯成DFA表后各個(gè)狀態(tài)間的關(guān)系如圖IA所示。其中圓圈表示狀態(tài)號(hào),箭頭表示 狀態(tài)遷移,箭頭邊的字符表示遷移條件。圖IA中,一共有0 3四個(gè)狀態(tài),其中狀態(tài)3是接受態(tài),狀態(tài)0是失敗態(tài)。狀態(tài)1 和狀態(tài)2是中間態(tài)。引擎開(kāi)始工作時(shí),狀態(tài)號(hào)初始化為1。初始狀態(tài)(狀態(tài)1)對(duì)應(yīng)的遷移關(guān)系數(shù)據(jù)必須儲(chǔ)存在確定的空間,為了方便,一般儲(chǔ)存在起始地址為1的儲(chǔ)存空間。這時(shí),則稱狀態(tài)1為 “當(dāng)前狀態(tài)”,引擎從待匹配數(shù)據(jù)里面取第一個(gè)字節(jié),根據(jù)狀態(tài)1所在的起始地址從狀態(tài)遷移 表取出狀態(tài)1的遷移關(guān)系數(shù)據(jù),然后引擎比較并判斷待匹配數(shù)據(jù)的第一個(gè)字節(jié)是“A”還是 “非A”。如果是“A”,則得知將遷移到狀態(tài)2(實(shí)際得到的是狀態(tài)2的遷移關(guān)系數(shù)據(jù)所在的 起始地址),這時(shí)狀態(tài)2稱為“下一狀態(tài)”;如果是“非A”,則得知將遷移到狀態(tài)0(實(shí)際得到 的也是狀態(tài)0的遷移關(guān)系數(shù)據(jù)所在的起始地址,由于是失敗態(tài),引擎不需要實(shí)際遷移到這 個(gè)狀態(tài)),這時(shí)狀態(tài)0稱為“下一狀態(tài)”。接著引擎“遷移到”狀態(tài)2,狀態(tài)2稱為“當(dāng)前狀態(tài)”。這時(shí)候再取待匹配數(shù)據(jù)的第 二個(gè)字節(jié),并根據(jù)狀態(tài)2所在的起始地址從狀態(tài)遷移表取出狀態(tài)2的遷移關(guān)系數(shù)據(jù),然后引 擎比較并判斷待匹配數(shù)據(jù)的第一個(gè)字節(jié)是“B”還是“非B”。如果是“B”,則得知將遷移到 狀態(tài)3 (實(shí)際得到的是狀態(tài)3的遷移關(guān)系數(shù)據(jù)所在的起始地址,由于是個(gè)接受態(tài),引擎不需 要實(shí)際遷移到這個(gè)狀態(tài)),這時(shí)狀態(tài)3稱為“下一狀態(tài)”;如果是“非A”,則得知將遷移到狀 態(tài)0 (實(shí)際得到的也是狀態(tài)0的遷移關(guān)系數(shù)據(jù)所在的起始地址,由于是失敗態(tài),引擎不需要 實(shí)際遷移到這個(gè)狀態(tài)),這時(shí)狀態(tài)0稱為“下一狀態(tài)”??傊鶕?jù)“某個(gè)狀態(tài)”對(duì)應(yīng)的遷移關(guān)系數(shù)據(jù)來(lái)對(duì)“待匹配數(shù)據(jù)”進(jìn)行比較并確定 將遷移到“另一個(gè)狀態(tài)”,則“某個(gè)狀態(tài)”稱為“當(dāng)前狀態(tài)”,得出的“另一個(gè)狀態(tài)”稱為“下一 狀態(tài)”。值得指出的是,如果是“當(dāng)前狀態(tài)”剛好是一個(gè)循環(huán)的狀態(tài),則“下一狀態(tài)”會(huì)等于 “當(dāng)前狀態(tài)”。本發(fā)明實(shí)施例圖1所示方法,通過(guò)將待匹配數(shù)據(jù)的數(shù)據(jù)類型分為Char型和Str 型,并根據(jù)不同的數(shù)據(jù)類型分別執(zhí)行不同的匹配處理過(guò)程。對(duì)于Str型數(shù)據(jù),是當(dāng)該Str型 所包含的多個(gè)字符全部匹配成功后才遷移到下一狀態(tài),從而節(jié)省了遷移邊,使?fàn)顟B(tài)遷移表 需要記錄的狀態(tài)減少,可以極大地減小狀態(tài)遷移表所占用的儲(chǔ)存空間,并提高匹配速度與 匹配效率。進(jìn)一步地,在本發(fā)明實(shí)施例的一較佳實(shí)施方式中,DFA狀態(tài)表中還包括字符映射 表,該字符映射表中包括字符值與映射值之間的映射關(guān)系。在該映射關(guān)系中,可以將一個(gè)或 多個(gè)字符值與一個(gè)映射值建立映射關(guān)系,或者,將一類相同類型的字符映射成一個(gè)映射值。圖2為本發(fā)明實(shí)施例的作為一個(gè)舉例的字符映射表的數(shù)據(jù)結(jié)構(gòu)示意圖。如圖2所 示,字符映射表保存報(bào)文字符與字符映射值之間的映射關(guān)系。圖2示例性給出的字符值與 映射之間的映射關(guān)系包括將ASCII碼值為0-96、100、102-255的多個(gè)字符值映射成映射值 OJfASCII碼值為97-98的多個(gè)字符值映射成映射值UfASCII碼值為99的字符值映射 成映射值2,將ASCII碼值為101的字符值映射為3。當(dāng)然,對(duì)應(yīng)于不同的DFA表,可以采用 不同的字符映射表。圖1中步驟106的處理過(guò)程具體可以包括如下步驟將待匹配報(bào)文中 當(dāng)前狀態(tài)的單個(gè)字符值的映射值與匹配條件進(jìn)行匹配處理。此外,字符映射表還可以把一類相同類型的字符映射為一個(gè)映射值。舉例如下規(guī) 則/a\s ? [a-z]+/表示的是字母a后面跟著0個(gè)或多個(gè)空格,其后再跟著一個(gè)或多個(gè)小寫 字母。生成字符映射表時(shí),會(huì)把字符a映射成一個(gè)值(例如1);空格對(duì)應(yīng)的字符映射成另 一個(gè)值(例如2);字母a至ζ之間的字母映射成又一個(gè)值(例如3);不屬于前面三種情況 的字符都映射成另一個(gè)值(例如0)。DFA狀態(tài)表在從一個(gè)狀態(tài)遷移到另一個(gè)狀態(tài)時(shí),可能會(huì)有多個(gè)不同的遷移邊(即遷移所對(duì)應(yīng)的字符)。如果把每個(gè)遷移邊都分別記錄,則表項(xiàng)數(shù)據(jù)會(huì)很大,不方便硬件實(shí) 現(xiàn)。所以本發(fā)明實(shí)施例較佳地采用了字符映射的方法,利用字符映射表將字符做一次映射, 并把這些有相同遷移方向的遷移邊(字符)映射到同一個(gè)映射值上去。然后用映射值代替 字符作為遷移邊,并記錄在狀態(tài)遷移表中,同時(shí)記錄字符映射表。這樣可以極大地減小狀態(tài) 遷移表所占用的儲(chǔ)存空間。例如/[a-ζ]/,如果在遷移表中直接用字符作為遷移邊,則要記 錄a ζ共沈種遷移情況;而使用字符映射表之后,把a(bǔ) ζ都映射成同一個(gè)映射值,并 用這個(gè)映射值作為遷移邊,則只需要記錄一個(gè)遷移邊,有利于縮小DFA狀態(tài)表項(xiàng)。需要說(shuō)明 的是,術(shù)語(yǔ)“字符”不僅限于ASCII碼字符,ASCII碼外的格式也支持,例如中文字符,日文, TLV(Tag Length Value,標(biāo)簽,長(zhǎng)度,數(shù)值)等格式。進(jìn)一步地,在本發(fā)明實(shí)施例的另一較佳實(shí)施方式中,對(duì)數(shù)據(jù)類型進(jìn)一步進(jìn)行了細(xì) 分,增加了一種數(shù)據(jù)類型重復(fù)字符Rep型,該Rep型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)出現(xiàn)多次的屬于一 定范圍內(nèi)的多個(gè)字符。以下舉例詳細(xì)說(shuō)明Rep型數(shù)據(jù)。例如在正則表達(dá)式/teSt\S*W-9] {5}/中,第一個(gè)字符t總是分類為單個(gè)字符 Char型,\s*表示任意個(gè)數(shù)的空格,也分類為單個(gè)字符型,est分類為多個(gè)字符Str型,
{5}表示0至9之間的數(shù)字連續(xù)出現(xiàn)5次,則分類為重復(fù)字符R印型。又例如/tel :
{3}-
{8} [a-z] {100}/,第一個(gè)字符t和-都編譯成單個(gè)字符Char型,通配符“- ”, 表示?出現(xiàn)的次數(shù)為0次或者1次,el 這三個(gè)字符則編譯成多個(gè)字符Mr型,
{3}、
{8}和[a-z] {100}則編譯成重復(fù)字符Rep型。進(jìn)一步地,在本發(fā)明實(shí)施例的又一較佳實(shí)施方式中,在DFA狀態(tài)表中增加了狀態(tài) 屬性表,根據(jù)該狀態(tài)屬性表可以更好地區(qū)分上述三種數(shù)據(jù)類型,特別是在正則表達(dá)式較為 復(fù)雜的情況下。圖3為本發(fā)明實(shí)施例的狀態(tài)屬性表的結(jié)構(gòu)示意圖。如圖3所示,各個(gè)數(shù)據(jù)域 的定義分別為第一地址閾值當(dāng)狀態(tài)地址大于或等于時(shí),表示該狀態(tài)屬 于Str型數(shù)據(jù);第二地址閾值R印Jiiin 當(dāng)狀態(tài)地址大于或者等于R印_min且小于Mr_min 時(shí),表示該狀態(tài)屬于Rep型數(shù)據(jù);另外,如果狀態(tài)地址小于R印_min,則表示當(dāng)前狀態(tài)對(duì)應(yīng)的 數(shù)據(jù)類型是Char型;Lower 輸入字符大小寫轉(zhuǎn)換標(biāo)記,舉例來(lái)說(shuō),為1表示不區(qū)分大小寫, 在做數(shù)據(jù)比較時(shí),可以統(tǒng)一轉(zhuǎn)為小寫值進(jìn)行比較。需要說(shuō)明的是,各字段長(zhǎng)度(比特?cái)?shù))可 根據(jù)正則表達(dá)式的規(guī)則復(fù)雜度進(jìn)行靈活設(shè)置。狀態(tài)屬性表包含了 DFA狀態(tài)表相關(guān)的參數(shù)信 息,可以用于確定狀態(tài)遷移表中的數(shù)據(jù)處理類型及大小寫是否敏感。需要說(shuō)明的是,在圖2和圖3給出的較佳實(shí)施例中,DFA狀態(tài)表是由正則表達(dá)式 DFA表編譯器生成,該編譯器會(huì)對(duì)正則表達(dá)式分析編譯出來(lái)的原始DFA狀態(tài)表做進(jìn)一步分 析,生成三個(gè)子表狀態(tài)屬性表、字符映射表和狀態(tài)遷移表。本發(fā)明實(shí)施例中的正則表達(dá)式 匹配裝置從正則表達(dá)式DFA表編譯器中獲得上述三個(gè)子表。具體地,為了簡(jiǎn)化正則表達(dá)式 匹配裝置的處理流程,進(jìn)一步壓縮狀態(tài)遷移表所占用的儲(chǔ)存空間,上述編譯器將狀態(tài)遷移 表數(shù)據(jù)分成上述三種類型=Char型、Str型、R印型(只區(qū)分?jǐn)?shù)據(jù)類型,不拆分表項(xiàng))。以下對(duì)本發(fā)明的一較佳實(shí)施例中DFA表包含的狀態(tài)遷移表進(jìn)行更為詳細(xì)的說(shuō)明。圖4為本發(fā)明實(shí)施例1的狀態(tài)遷移表的結(jié)構(gòu)示意圖。雖然圖4僅示出了一行地 址,但實(shí)際情況下圖4中的地址也可以分成多行。如圖4所示,狀態(tài)遷移表保存的是DFA 的每個(gè)狀態(tài)在輸入某個(gè)/某些字符時(shí)可以遷移到的下一個(gè)狀態(tài)的地址,以及該狀態(tài)的Itep/ Str屬性數(shù)據(jù)。如果該狀態(tài)無(wú)Rep/Str屬性,則該遷移數(shù)據(jù)不含Rep/Str屬性數(shù)據(jù)域,只有NextstJ) Nextst_n。其中,NextSt_0,-,NextSt_n表示狀態(tài)機(jī)接收字符映射值為0,…, η的字符對(duì)應(yīng)的下一個(gè)遷移狀態(tài)地址,映射值較佳地為連續(xù)的數(shù)字,有利于節(jié)省存儲(chǔ)DFA表 的空間。例如,假設(shè)映射值設(shè)置為0、1、2,上述映射值在存儲(chǔ)空間中連續(xù)依次存儲(chǔ),只需要三 個(gè)存儲(chǔ)位置;而如果映射值取不連續(xù)的1、3、5,則上述映射值在存儲(chǔ)空間中相應(yīng)的是間隔 存儲(chǔ),中間會(huì)額外多占用2個(gè)空余的存儲(chǔ)位置,一共占用5個(gè)存儲(chǔ)位置,這樣就會(huì)浪費(fèi)存儲(chǔ) 空間,而且采用不連續(xù)的映射值還可能需要增加相應(yīng)的解析算法,導(dǎo)致處理復(fù)雜度增加,而 采用連續(xù)的映射值既可以節(jié)省存儲(chǔ)空間還可使處理算法的復(fù)雜度降低。以下配合圖4Α和圖4Β對(duì)Str型的數(shù)據(jù)和Rep型的數(shù)據(jù)分別進(jìn)行詳細(xì)說(shuō)明。圖4Α為本發(fā)明實(shí)施例1的Str型屬性數(shù)據(jù)結(jié)構(gòu)的示意圖。如圖4Α所示,Str型的 數(shù)據(jù)表示該狀態(tài)是多個(gè)字符型狀態(tài),需要匹配字符串后進(jìn)行狀態(tài)遷移。若匹配過(guò)程中失敗, 則從失敗處取該字符的映射值按照狀態(tài)遷移表進(jìn)行遷移。數(shù)據(jù)說(shuō)明如下=StrExitM字段 字符串匹配完畢后的遷移至下一狀態(tài)的地址;StrLen 字符串占用字符個(gè)數(shù)nl,其中,nl為 正整數(shù);String 字符串的字符值。需要說(shuō)明的是,各字段長(zhǎng)度(比特?cái)?shù))可根據(jù)正則表達(dá) 式的規(guī)則復(fù)雜度進(jìn)行靈活設(shè)置。圖4B為本發(fā)明實(shí)施例1的R印型屬性數(shù)據(jù)結(jié)構(gòu)的示意圖。如圖4B所示,對(duì)于R印 型的數(shù)據(jù),在匹配時(shí)判斷一類字符的重復(fù)次數(shù),計(jì)數(shù)達(dá)到預(yù)定次數(shù)次后遷移到指定狀態(tài),中 途若失敗則按照狀態(tài)遷移表進(jìn)行狀態(tài)遷移。數(shù)據(jù)說(shuō)明=RepExitM字段該Rep型數(shù)據(jù)匹配 成功后遷移至下一狀態(tài)的地址;Count字段相同類型字符的重復(fù)次數(shù)π2,其中,η2為正整 數(shù)。Mask字段Rep型數(shù)據(jù)的字符集合映射值的掩碼,用來(lái)表示當(dāng)前字符的映射值是否在預(yù) 定范圍之內(nèi),若是,則進(jìn)行計(jì)數(shù)器,直到達(dá)到預(yù)定計(jì)數(shù)值。上述掩碼值由本發(fā)明實(shí)施例的正 則表達(dá)式匹配裝置從正則表達(dá)式DFA表編譯器處獲得。以下通過(guò)舉例來(lái)說(shuō)明MASK值的生 成方法或規(guī)則。假設(shè)R印型數(shù)據(jù)[A-C] {5},其表示A-C范圍內(nèi)的字符重復(fù)出現(xiàn)5次,再假設(shè) 字符映射表中將A、B、C分別一一映射為映射值0、1、2,當(dāng)然根據(jù)字符映射表的設(shè)置,可以將 多個(gè)字符映射成一個(gè)映射值,然后,根據(jù)映射值將Mask字段中與映射值對(duì)應(yīng)的比特位置1, 即將mask值的bit0、bitl、bit2均置為1,這樣就得到了 mask值為0x07。在上述處理過(guò)程 可以看出,本發(fā)明實(shí)施例是用一個(gè)bit位來(lái)代替一個(gè)映射值,mask值是由上述映射值所構(gòu) 成,這種處理方法進(jìn)一步地降低了映射值所占的存儲(chǔ)空間。以下舉例說(shuō)明如何根據(jù)mask值來(lái)確定映射值是否為有效范圍內(nèi)的映射值的處理 過(guò)程例如,mask值為0x09,即二進(jìn)制的1001,bit3和bitO有效(為1),則表示映射值為 0和3的字符為預(yù)定范圍內(nèi)的字符,而bitl和bit2所對(duì)應(yīng)的映射值1、2不是有效的映射 值,其所對(duì)應(yīng)的字符并非預(yù)定范圍內(nèi)的字符。又例如mask值為0x7,即二進(jìn)制的lll,bit2、 bitl和bitO都有效(為1),則表示映射值為0、1和2的字符為預(yù)定范圍內(nèi)的字符。在匹配處理的過(guò)程中,對(duì)于不同的數(shù)據(jù)類型,分別按照以下方式進(jìn)行匹配處理。一種情況,如果狀態(tài)遷移表中保存的匹配條件及符合匹配條件的下一狀態(tài)包括 Char型數(shù)據(jù)匹配條件以及符合Char型數(shù)據(jù)匹配條件的下一狀態(tài);其中,Char型數(shù)據(jù)匹配 條件包括預(yù)先配置的Char型數(shù)據(jù)的映射值,符合匹配條件的下一狀態(tài)是對(duì)應(yīng)于預(yù)先配置 的Char型數(shù)據(jù)的映射值和當(dāng)前狀態(tài)的狀態(tài)號(hào)的下一狀態(tài)的地址。這種情況下的處理過(guò)程 是如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值對(duì) 應(yīng)的映射值與預(yù)先配置的Char型數(shù)據(jù)的映射值進(jìn)行比較,如一致,則根據(jù)當(dāng)前狀態(tài)的狀態(tài)
10號(hào)和當(dāng)前狀態(tài)的映射值,查詢所述狀態(tài)遷移表以獲得下一狀態(tài)的地址,并遷移到下一狀態(tài)。另一種情況,如果狀態(tài)遷移表中保存的匹配條件及符合匹配條件的遷移地址還進(jìn) 一步包括Str型數(shù)據(jù)匹配條件以及符合Str型數(shù)據(jù)匹配條件的下一狀態(tài);其中,Str型數(shù)據(jù) 匹配條件包括存儲(chǔ)于MrLen字段中的預(yù)設(shè)字符個(gè)數(shù)nl,其中,nl為正整數(shù);以及存儲(chǔ)于 Mring字段中的預(yù)設(shè)的nl個(gè)字符各自的字符值;所述符合匹配條件的下一狀態(tài)包括存儲(chǔ) 于MrExitM字段中的Str型數(shù)據(jù)匹配成后遷移至下一狀態(tài)的地址。在這種情況下,對(duì)于 Str型數(shù)據(jù)的處理過(guò)程包括將待匹配報(bào)文中當(dāng)前狀態(tài)的nl個(gè)字符值,與Mring字段存儲(chǔ) 的nl個(gè)字符值依次進(jìn)行比較,當(dāng)全部相等時(shí),根據(jù)MrExitM字段指示的下一狀態(tài)的地址 遷移到下一狀態(tài)。還一種情況,如果狀態(tài)遷移表中保存的匹配條件及符合匹配條件的遷移地址還進(jìn) 一步包括R印型數(shù)據(jù)匹配條件以及符合R印型數(shù)據(jù)匹配條件的下一狀態(tài);其中,所述R印 型數(shù)據(jù)匹配條件包括存儲(chǔ)于Count字段中的重復(fù)次數(shù)π2,其中,n2為正整數(shù);以及存儲(chǔ)于 Mask字段中的掩碼;所述符合R印型數(shù)據(jù)匹配條件的下一狀態(tài)存儲(chǔ)于R印ExitM字段中 的指示R印型數(shù)據(jù)匹配成功后遷移至下一狀態(tài)的地址。在這種情況下,對(duì)于R印型數(shù)據(jù)的 處理過(guò)程包括如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Rep型,將待匹配報(bào)文中n2個(gè)字符分別對(duì) 應(yīng)的映射值與Mask字段中的掩碼進(jìn)行比較,當(dāng)π2個(gè)字符各自對(duì)應(yīng)的映射值全部在所述掩 碼范圍內(nèi)時(shí),根據(jù)所述R印ExitM字段指示的下一狀態(tài)的地址遷移到下一狀態(tài)。又一種情況,如果狀態(tài)遷移表中保存的匹配條件及符合匹配條件的遷移地址包括 上述三種類型時(shí),其處理過(guò)程可將上述三種處理方法結(jié)合。可選地,圖1所示方法還可以進(jìn)一步包括步驟如果在Str型數(shù)據(jù)或者R印型數(shù)據(jù) 的匹配過(guò)程中發(fā)生不匹配的情形,則獲取該不匹配的字符對(duì)應(yīng)的映射值,根據(jù)映射值和當(dāng) 前狀態(tài)的狀態(tài)號(hào),查詢狀態(tài)遷移表得出下一狀態(tài)地址,并遷移到下一狀態(tài)??蛇x地,圖1所 示方法還可以進(jìn)一步包括如下步驟當(dāng)下一狀態(tài)為失敗態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配失 敗結(jié)果;或者,當(dāng)下一狀態(tài)既不是接受態(tài)也不是失敗態(tài),并且當(dāng)前匹配的字符是待匹配報(bào)文 的最后一個(gè)字符時(shí),結(jié)束匹配過(guò)程并輸出匹配失敗結(jié)果。具體地,判斷下一狀態(tài)是何種狀態(tài) 可依據(jù)下列處理步驟當(dāng)下一狀態(tài)的地址大于或等于預(yù)設(shè)的接受態(tài)地址閾值時(shí),確定下一 狀態(tài)為接受態(tài);當(dāng)下一狀態(tài)的地址大于預(yù)設(shè)的失敗態(tài)地址閾值且小于預(yù)設(shè)的接受態(tài)地址閾 值時(shí),確定下一狀態(tài)為中間態(tài);當(dāng)下一狀態(tài)的地址等于預(yù)設(shè)的失敗態(tài)地址閾值時(shí),確定下一 狀態(tài)為失敗態(tài)。此外,可選的,在采用地址閾值區(qū)分中間態(tài)和接受態(tài),并且也采用地址閾值 區(qū)分Str型、Char型和Itep型數(shù)據(jù)時(shí),可以將中間態(tài)的地址閾值再分為Str型、Char型和 Rep型數(shù)據(jù)三段地址閾值,失敗態(tài)和接受態(tài)可以不區(qū)分?jǐn)?shù)據(jù)類型,當(dāng)下一狀態(tài)為接受態(tài)但還 有字符需要匹配時(shí),可以跳轉(zhuǎn)到相應(yīng)的中間態(tài)繼續(xù)進(jìn)行匹配過(guò)程。本領(lǐng)域普通技術(shù)人員可 以理解,采用地址閾值區(qū)分?jǐn)?shù)據(jù)類型和狀態(tài)類型僅僅是本發(fā)明的一種具體實(shí)現(xiàn)方式,此外 也可以直接將數(shù)據(jù)類型和狀態(tài)類型寫在DFA狀態(tài)表中,或者另外單獨(dú)維護(hù)數(shù)據(jù)類型和狀態(tài) 類型,對(duì)于數(shù)據(jù)類型還可以直接采取默示的方式,即當(dāng)DFA狀態(tài)表的相應(yīng)表項(xiàng)中有Char型 或Rep型數(shù)據(jù)時(shí)優(yōu)先嘗試匹配Char型或R印型數(shù)據(jù)??蛇x地,在圖1所示方法中,可以將待匹配報(bào)文的第一個(gè)字符處理為Char型數(shù)據(jù)。以下對(duì)本發(fā)明實(shí)施例的方法達(dá)到的提高匹配速度的優(yōu)點(diǎn)進(jìn)行詳細(xì)說(shuō)明。本發(fā)明實(shí)施例采用了字符映射的方法,把在某個(gè)當(dāng)前狀態(tài)下,遷移到某個(gè)下一狀態(tài)的多個(gè)作為遷移條件的字符映射為一個(gè)單一的映射值,而且不同狀態(tài)之間的遷移條件相 同時(shí),可以共用一個(gè)映射值。通過(guò)減少遷移邊,在正則表達(dá)式比較復(fù)雜的情況下可以減少了 狀態(tài)遷移表所占的儲(chǔ)存空間。例如,在狀態(tài)遷移表的空間遠(yuǎn)遠(yuǎn)大于字符映射表的情況下,所 增加的字符是映射表的空間較小,其所增加的存儲(chǔ)空間相比于其所能節(jié)省的存儲(chǔ)空間小得 多,這樣就達(dá)到了減少狀態(tài)遷移表所占儲(chǔ)存空間的目的。另外,本發(fā)明實(shí)施例還將狀態(tài)遷移表數(shù)據(jù)分為Char型、Str型和R印型數(shù)據(jù)。Char 型數(shù)據(jù)用映射值確定作為遷移條件,可以節(jié)省儲(chǔ)存空間。Str型數(shù)據(jù)把通常技術(shù)中的DFA表 中一長(zhǎng)串字符合成一個(gè)遷移條件,原始DFA表中這一長(zhǎng)串字符對(duì)應(yīng)的多個(gè)狀態(tài)也就合成一 個(gè)狀態(tài),這樣可以明顯減少遷移關(guān)系數(shù)據(jù)所占的儲(chǔ)存空間。另外正如前面對(duì)圖IA中所述, 狀態(tài)發(fā)生遷移時(shí),需要重新計(jì)算狀態(tài)遷移表的訪問(wèn)地址,并根據(jù)這個(gè)新的地址從狀態(tài)遷移 表取出新的匹配條件才能進(jìn)行比較和判斷,所以減少狀態(tài)的數(shù)量也就是減少了引擎做狀態(tài) 遷移所需的的時(shí)間,提高了匹配的速度。Rep數(shù)據(jù)把多個(gè)相同的遷移條件的狀態(tài)合并成一個(gè) 狀態(tài),減少了狀態(tài)遷移所需的時(shí)間,提高了匹配速度;本發(fā)明實(shí)施例還使用了映射值構(gòu)成的 掩碼(mask),使用映射值以及采用掩碼來(lái)表示映射值的方法可以減少遷移條件所占的儲(chǔ)存 空間。DFA表所占的儲(chǔ)存空間小,則引擎可以用更小的數(shù)據(jù)位寬。而在其他條件相同的情 況下,數(shù)據(jù)位寬小的裝置能比數(shù)據(jù)位寬大的裝置運(yùn)行速度更快,效率更高。進(jìn)一步地,以下以正則表達(dá)式廠test
{5}/si為例,進(jìn)一步詳細(xì)說(shuō)明本發(fā)明 實(shí)施例1的正則表達(dá)式匹配方法。需要注意的是,實(shí)際情況下DFA編譯器可能同時(shí)編譯多 個(gè)正則表達(dá)式,以下是為了描述方便僅說(shuō)明了其中一條正則表達(dá)式。圖5為本發(fā)明實(shí)施例1的作為又一個(gè)舉例的字符映射表的結(jié)構(gòu)示意圖。編譯時(shí), 依據(jù)圖5所示的字符映射表,把
對(duì)應(yīng)的ASCII碼值映射為1,t (ASCII值為116)和 T(ASCII值為84)映射為2,其余字符映射為0。圖6為本發(fā)明實(shí)施例1作為舉例的一個(gè)狀 態(tài)屬性表的示意圖,其中R印_min為0x2,Mr_min為0x5,Lower為0x1。根據(jù)圖6可知,狀 態(tài)所在的地址大于或者等于Ox 5則屬于Mr類型的數(shù)據(jù),狀態(tài)所在的地址在大于等于Ox 2 且小于Ox 5則屬于R印類型的數(shù)據(jù),狀態(tài)所在的地址小于Ox 2則為Char類型的數(shù)據(jù)。圖7為本發(fā)明實(shí)施例1的狀態(tài)遷移表的一個(gè)示例圖,如圖7所示,該狀態(tài)遷移表中 一共含有3個(gè)狀態(tài)。第一行的0,1,2表示映射值,state χ表示狀態(tài)號(hào),statel表示狀態(tài)1, state2表示狀態(tài)2,state3表示狀態(tài)3。其中狀態(tài)1是Char型的數(shù)據(jù);狀態(tài)2有Mask域, 是R印型數(shù)據(jù),且狀態(tài)2中Mask值為0x2,即二進(jìn)制的10,bitl有效,bitO無(wú)效,表示當(dāng)待 匹配字符的映射值為1時(shí)在該Mask值的范圍之內(nèi),Count字段取值為5,表示重復(fù)次數(shù)為5 次,且R印ExitM字段的指示的地址是預(yù)先配置的0x01F8 ;狀態(tài)3有string域,是Str型 數(shù)據(jù),字符長(zhǎng)度為3個(gè),Mring字段中存儲(chǔ)了用于匹配的0x65、0x73、0x74,分別對(duì)應(yīng)于e、 s、t,且MrExitM字段的指示的地址是0x0002。假設(shè)輸入的待查找匹配的報(bào)文為Testl23456789。正則表達(dá)式匹配裝置開(kāi)始查找 時(shí),將當(dāng)前狀態(tài)(初始狀態(tài))置為1,statel的存儲(chǔ)地址是0x0001。然后,讀入字符T對(duì) 應(yīng)的映射值,根據(jù)圖5示出的映射表可知映射值為2。然后,根據(jù)映射值2查詢當(dāng)前狀態(tài) (statel)對(duì)應(yīng)的狀態(tài)遷移表,如圖7所示,statel下映射值為2時(shí)對(duì)應(yīng)的下一狀態(tài)地址是 0x0005,而0x0005為state3的存儲(chǔ)地址,于是從statel遷移到state3。然后,判斷state3所對(duì)應(yīng)的數(shù)據(jù)類型,由于state3的地址0x0005等于Mr_min,所以可知是Str類型的數(shù) 據(jù)。接著,依次讀取待查找報(bào)文中的e,s, t,并跟狀態(tài)遷移表中地址0x0005對(duì)應(yīng)的string 字段存儲(chǔ)的0X65:e,0X73:S,0X74:t進(jìn)行比較,比較后發(fā)現(xiàn)三個(gè)字符都相等,于是遷移到 StrExitSt字段指示的遷移地址0x0002,即從state3遷移到state2。接著,判斷state2的 數(shù)據(jù)類型,由于state2的地址0x0002處于Itepjnin (0x0002)和Mrjnin (0x0005)之間,則 確定狀態(tài)2屬于R印類型的數(shù)據(jù),于是依次讀入字符1,2,3,4,5的映射值,根據(jù)圖5可知,字 符1-5的映射值都為1,而掩碼Mask值為0x02,即bitl為l,bitl為有效位,所以1_5的映 射值在掩碼Mask值的范圍之內(nèi),滿足循環(huán)5次的條件,得到Exit_st字段指示的地址OxlFS 作為下一個(gè)狀態(tài)所在的地址,發(fā)現(xiàn)是一個(gè)接受態(tài)(大于或等于接受態(tài)閾值),于是整個(gè)正則 表達(dá)式匹配成功。假設(shè)輸入的待查找匹配的報(bào)文為ffestl23456789。正則表達(dá)式匹配裝置開(kāi)始查找 時(shí),將當(dāng)前狀態(tài)(初始狀態(tài))置為1,statel的存儲(chǔ)地址是0x0001。然后,讀入字符W對(duì) 應(yīng)的映射值,根據(jù)圖5示出的映射表可知映射值為0。然后,根據(jù)映射值0查詢當(dāng)前狀態(tài) (statel)對(duì)應(yīng)的狀態(tài)遷移表,得到下一狀態(tài)的地址為0x0,于是遷移到下一狀態(tài),然后,判 斷該下一狀態(tài)為失敗態(tài),因此整個(gè)正則表達(dá)式匹配失敗,輸出匹配失敗的結(jié)果。假設(shè)輸入的待查找匹配的報(bào)文為Tbstl2345。正則表達(dá)式匹配裝置開(kāi)始查找時(shí),將 當(dāng)前狀態(tài)(初始狀態(tài))置為1,statel的存儲(chǔ)地址是0x0001。然后,讀入字符T對(duì)應(yīng)的映 射值,根據(jù)圖5示出的映射表可知映射值為2。然后,根據(jù)映射值2查詢當(dāng)前狀態(tài)(statel) 對(duì)應(yīng)的狀態(tài)遷移表,如圖7所示,statel下映射值為2時(shí)對(duì)應(yīng)的下一狀態(tài)地址是0x0005,而 0x0005為state3的存儲(chǔ)地址,于是從statel遷移到state3。然后,判斷state3所對(duì)應(yīng)的 數(shù)據(jù)類型,由于state3的地址0x0005等于Mr_min,所以可知是Str類型的數(shù)據(jù)。接著,依 次讀取待查找報(bào)文中的b,s, t,并跟狀態(tài)遷移表中地址0x0005對(duì)應(yīng)的string字段存儲(chǔ)的 0x65 e,0x73 s,0x74 t進(jìn)行比較,發(fā)現(xiàn)待查找報(bào)文中的b與string字段存儲(chǔ)的0x65 e不 相等,則不再比較后續(xù)字符,獲取字符b的映射值,根據(jù)圖5可知,字符b的映射值為0,查詢 圖7所示的狀態(tài)遷移表可知,state3時(shí)映射值0對(duì)應(yīng)的下一狀態(tài)的地址為0x0,該地址為失 敗態(tài)地址,于是整個(gè)正則表達(dá)式匹配失敗,輸出匹配失敗的結(jié)果。假設(shè)輸入的待查找匹配的報(bào)文為Testl234。對(duì)于Char型數(shù)據(jù)T和Str型數(shù)據(jù)est 的匹配過(guò)程與前面相同,以下只描述對(duì)R印型數(shù)據(jù)1234的匹配過(guò)程。判斷state2的數(shù)據(jù) 類型,由于state2的地址0x0002處于Itepjnin (0x0002)和Mrjnin (0x0005)之間,則確定 狀態(tài)2屬于R印類型的數(shù)據(jù),于是依次讀入字符1,2,3,4的映射值,并逐個(gè)判斷每一個(gè)映射 值是否在掩碼Mask值的范圍之內(nèi)。根據(jù)圖5可知,字符1-4的映射值都為1,而掩碼Mask 值為0x02,即bitl為有效位,所以1-4的映射值在掩碼Mask值的范圍之內(nèi)。但是,上述匹 配過(guò)程只循環(huán)了 4次,不滿足循環(huán)5次的條件且已經(jīng)到達(dá)待查找報(bào)文的結(jié)尾,于是整個(gè)正則 表達(dá)式匹配失敗,輸出匹配失敗結(jié)果。本發(fā)明實(shí)施例1提供的正則表達(dá)式的匹配方法,通過(guò)用字符映射值來(lái)代替同一類 字符,有利于可以極大地減小狀態(tài)遷移表所占用的儲(chǔ)存空間。通過(guò)將待匹配報(bào)文分成單個(gè) 字符型、多個(gè)字符型重復(fù)字符型,并根據(jù)狀態(tài)的存儲(chǔ)地址來(lái)判斷數(shù)據(jù)類型,以便采用不同的 處理類型或方式,以及根據(jù)狀態(tài)的儲(chǔ)存地址來(lái)判斷當(dāng)前的狀態(tài)是接受態(tài)還是失敗態(tài),可以 加快匹配速度、提高運(yùn)行效率,不需要回溯。
實(shí)施例2 本發(fā)明實(shí)施例2提供了一種正則表達(dá)式匹配裝置。圖8為本發(fā)明實(shí)施例2的正則 表達(dá)式匹配裝置的功能框圖。如圖8所示,該裝置200包括報(bào)文及DFA表載入單元210,用于輸入待匹配報(bào)文及確定性有限自動(dòng)機(jī)DFA狀態(tài) 表,所述DFA狀態(tài)表包括狀態(tài)遷移表,所述狀態(tài)遷移表中包括正則表達(dá)式匹配過(guò)程中的所 有狀態(tài)地址和各個(gè)狀態(tài)之間的遷移關(guān)系,所述遷移關(guān)系包括匹配條件及符合匹配條件的下 一狀態(tài);查找單元230,包括數(shù)據(jù)類型確定模塊231、匹配模塊232及輸出模塊234 ;數(shù)據(jù)類型確定模塊231,用于判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型,所述數(shù)據(jù)類型包括單 個(gè)字符Char型和多個(gè)字符Str型,所述Str型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)的多個(gè)字符;匹配模塊232,用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Str型,則將待匹配報(bào)文中當(dāng) 前狀態(tài)的多個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下 一狀態(tài);如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符 值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài);輸出模塊234,用于當(dāng)所述下一狀態(tài)為接受態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配成功結(jié)^ ο可選地,DFA狀態(tài)表還包括字符映射表,所述字符映射表中包括字符值與映射值之 間的映射關(guān)系;圖8所示裝置還可以進(jìn)一步包括報(bào)文預(yù)處理單元220,用于根據(jù)上述字符 映射表對(duì)上述待匹配報(bào)文進(jìn)行映射處理,生成一個(gè)或多個(gè)映射值。匹配模塊232,還可以用于將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值的映射值與匹 配條件進(jìn)行匹配處理??蛇x地,數(shù)據(jù)類型還可以重復(fù)字符R印型,R印型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)出現(xiàn)多次的屬 于一定范圍內(nèi)的多個(gè)字符。數(shù)據(jù)類型確定模塊231,還可以用于判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù) 類型,所述數(shù)據(jù)類型包括單個(gè)字符Char型、多個(gè)字符Str型和重復(fù)字符Rep型。匹配模塊 232,還可以用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Rep型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的映 射值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài)??蛇x地,DFA狀態(tài)表還包括狀態(tài)屬性表,狀態(tài)屬性表包括第一地址閾值Mrjnin和 第二地址閾值R印Jiiin ;數(shù)據(jù)類型確定模塊231,具體可以用于如果當(dāng)前狀態(tài)的地址大于或 等于所述Mr_min,則確定當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Str型;如果當(dāng)前狀態(tài)的地址大于或 等于所述R印_min,并且小于所述Mr_min,則確定當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Rep型;或 者,如果當(dāng)前狀態(tài)的地址小于所述Itepjnin,則確定當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型。具體地,匹配條件包括預(yù)先配置的Char型數(shù)據(jù)的映射值,符合匹配條件的下一狀 態(tài)是對(duì)應(yīng)于所述預(yù)先配置的Char型數(shù)據(jù)的映射值和當(dāng)前狀態(tài)的狀態(tài)號(hào)的下一狀態(tài)的地 址;匹配模塊232,具體可以用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型,則將待匹配報(bào)文 中當(dāng)前狀態(tài)的單個(gè)字符值對(duì)應(yīng)的映射值與預(yù)先配置的Char型數(shù)據(jù)的映射值進(jìn)行比較,如 一致,則根據(jù)當(dāng)前狀態(tài)的狀態(tài)號(hào)和當(dāng)前狀態(tài)的映射值,查詢狀態(tài)遷移表以獲得下一狀態(tài)的 地址,并遷移到下一狀態(tài)??蛇x地,上述匹配條件及符合匹配條件的下一狀態(tài)包括Str型數(shù)據(jù)匹配條件以 及符合Str型數(shù)據(jù)匹配條件的下一狀態(tài);其中,Str型數(shù)據(jù)匹配條件包括存儲(chǔ)于MrLen字段中的預(yù)設(shè)字符個(gè)數(shù)nl,其中,nl為正整數(shù);以及存儲(chǔ)于乂!^叫字段中的預(yù)設(shè)的nl個(gè)字符 各自的字符值;符合匹配條件的下一狀態(tài)包括存儲(chǔ)于StrExitM字段中的Str型數(shù)據(jù)匹 配成后遷移至下一狀態(tài)的地址。匹配模塊232,具體可以用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型 是Str型,將待匹配報(bào)文中當(dāng)前狀態(tài)的nl個(gè)字符值,與Mring字段存儲(chǔ)的nl個(gè)字符值依 次進(jìn)行比較,當(dāng)全部相等時(shí),根據(jù)StrExitM字段指示的下一狀態(tài)的地址遷移到下一狀態(tài)??蛇x地,上述匹配條件及符合匹配條件的下一狀態(tài)包括R印型數(shù)據(jù)匹配條件以 及符合R印型數(shù)據(jù)匹配條件的下一狀態(tài);其中,述R印型數(shù)據(jù)匹配條件包括存儲(chǔ)于Count 字段中的重復(fù)次數(shù)n2,其中,π2為正整數(shù);以及存儲(chǔ)于Mask字段中的掩碼;符合Rep型數(shù) 據(jù)匹配條件的下一狀態(tài)存儲(chǔ)于R印ExitM字段中的指示R印型數(shù)據(jù)匹配成功后遷移至下 一狀態(tài)的地址。匹配模塊232,具體可以用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Rep型,將待 匹配報(bào)文中n2個(gè)字符分別對(duì)應(yīng)的映射值與Mask字段中的掩碼進(jìn)行比較,當(dāng)n2個(gè)字符各自 對(duì)應(yīng)的映射值全部在所述掩碼范圍內(nèi)時(shí),根據(jù)所述R印ExiUt字段指示的下一狀態(tài)的地址 遷移到下一狀態(tài)。可選地,輸出模塊234,還用于當(dāng)下一狀態(tài)為失敗態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配 失敗結(jié)果;或者,當(dāng)下一狀態(tài)既不是接受態(tài)也不是失敗態(tài),并且當(dāng)前匹配的字符是待匹配報(bào) 文的最后一個(gè)字符時(shí),結(jié)束匹配過(guò)程并輸出匹配失敗結(jié)果??蛇x地,查找單元230還可以進(jìn)一步包括狀態(tài)判斷模塊233,用于當(dāng)下一狀態(tài)的 地址大于或等于預(yù)設(shè)的接受態(tài)地址閾值時(shí),確定下一狀態(tài)為接受態(tài);當(dāng)下一狀態(tài)的地址大 于預(yù)設(shè)的失敗態(tài)地址閾值且小于預(yù)設(shè)的接受態(tài)地址閾值時(shí),確定下一狀態(tài)為中間態(tài);當(dāng)下 一狀態(tài)的地址等于預(yù)設(shè)的失敗態(tài)地址閾值時(shí),確定下一狀態(tài)為失敗態(tài)。具體地,上述字符包括ASCII碼字符或者UNICODE碼字符等可以用二進(jìn)制表示的 值。可選地,匹配模塊232,還可以用于將待匹配報(bào)文的第一個(gè)字符處理為Char型數(shù) 據(jù)??蛇x地,報(bào)文及DFA表載入單元210還包含緩存,該緩存包括先進(jìn)先出存儲(chǔ)器FIFO 和隨機(jī)存取存儲(chǔ)器RAM,該FIFO用于存儲(chǔ)狀態(tài)屬性表,該RAM用于存儲(chǔ)字符映射表和狀態(tài)遷 移表??蛇x地,圖8所示裝置還可以進(jìn)一步包括緩存管理單元對(duì)0,用于判斷和刷新緩 存的空滿狀態(tài)并反饋給報(bào)文及DFA表載入單元210。查找單元230查找結(jié)束后,通知緩存管 理單元240釋放當(dāng)前的緩存空間。緩存管理單元240根據(jù)當(dāng)前緩存使用情況,把釋放指示 轉(zhuǎn)換成緩存空指示并傳送給報(bào)文及DFA表載入單元210,報(bào)文及DFA表載入單元210便可以 載入新的報(bào)文及DFA表。需要說(shuō)明的是,由于報(bào)文及DFA表載入單元210無(wú)法預(yù)知查找單元230需要獲取 字符值還是映射值,所以本發(fā)明實(shí)施例2的正則表達(dá)式匹配裝置設(shè)置了報(bào)文預(yù)處理單元 210,來(lái)將字符值和映射值同時(shí)準(zhǔn)備好,以加快查找單元230的處理速度。報(bào)文預(yù)處理單220 元用于連續(xù)檢測(cè)輸入FIFO狀態(tài),在FIFO非空時(shí)讀出參數(shù)值,然后逐字節(jié)讀出報(bào)文并進(jìn)行映 射處理,向查找單元130輸出字符值和映射值。查找單元230在字符值和映射值準(zhǔn)備好后, 取出報(bào)文數(shù)據(jù)或者映射值,結(jié)合當(dāng)前所處的狀態(tài)號(hào),查找上述狀態(tài)遷移表,...如此循環(huán),直 到得到匹配結(jié)果。緩存管理單元M0,用于根據(jù)查找結(jié)果及緩存載入情況判斷該緩存的空滿狀態(tài),并把判斷結(jié)果輸出給報(bào)文及DFA表載入單元210。以下描述在一較佳實(shí)施例中,本發(fā)明實(shí)施例的正則表達(dá)式裝置的工作過(guò)程。圖9 為本發(fā)明實(shí)施例2的正則表達(dá)式匹配裝置200的工作流程圖。結(jié)合參閱圖8和圖9,包括如 下步驟步驟300 在內(nèi)部緩存RAM非滿時(shí),載入需要查找的報(bào)文和相應(yīng)的DFA表,本步驟 由圖8中的報(bào)文及DFA表載入單元210完成。DFA表由需要匹配的正則表達(dá)式規(guī)則編譯和 壓縮而成。步驟302 報(bào)文預(yù)處理單元220根據(jù)報(bào)文和DFA表中的存儲(chǔ)的字符映射表,獲取報(bào) 文數(shù)據(jù)進(jìn)行映射。具體做法是每次取一字節(jié)的的報(bào)文數(shù)據(jù),然后查找字符映射表,得到的結(jié) 果作為該字節(jié)數(shù)據(jù)對(duì)應(yīng)的映射值,并和這字節(jié)數(shù)據(jù)一起輸出給查找單元230。步驟304 查找單元230根據(jù)當(dāng)前狀態(tài)所在的地址和狀態(tài)屬性表中的R印_min和 Mrjiiin值,確定當(dāng)前匹配的字節(jié)屬于哪種數(shù)據(jù)類型。根據(jù)不同的類型取用報(bào)文數(shù)據(jù)或者映 射值,結(jié)合當(dāng)前狀態(tài)號(hào),查找報(bào)文及DFA表載入單元210中的狀態(tài)遷移表,得到下一狀態(tài)所 在地址。步驟306 查找單元230根據(jù)下一狀態(tài)的儲(chǔ)存地址判斷是否為接受態(tài)。例如狀態(tài) 地址為9bit時(shí),我們把所在的地址大于或等于接受態(tài)閾值的狀態(tài)判定為接收態(tài)。接受態(tài)的 地址范圍可以根據(jù)實(shí)際需要來(lái)設(shè)定。狀態(tài)機(jī)一旦跳到一個(gè)接受態(tài),則認(rèn)為當(dāng)前報(bào)文與規(guī)則 匹配成功。如果下一狀態(tài)不是接受態(tài),則轉(zhuǎn)到步驟310。步驟308 查找單元230輸出匹配成功結(jié)果,并通知緩存管理單元240釋放緩存。步驟310 下一狀態(tài)不是接受態(tài),查找單元230還需要判斷下一狀態(tài)是否為失敗 態(tài)(即下一狀態(tài)地址為0)。如是,則認(rèn)為當(dāng)前報(bào)文與規(guī)則匹配失敗,進(jìn)入步驟312;如否, 則轉(zhuǎn)到步驟314。未查找完報(bào)文就知道不匹配的主要是一些指定報(bào)文頭的規(guī)則,例如規(guī)則 廠test/,則只要報(bào)文的前四個(gè)字節(jié)不是test就認(rèn)為匹配失敗了。步驟312 查找單元230輸出不匹配結(jié)果,也即輸出匹配失敗結(jié)果,并通知緩存管 理單元140釋放緩存。步驟314 下一狀態(tài)既不是接受態(tài)也不是失敗態(tài)的,查找單元230還需要判斷當(dāng)前 字節(jié)是否為報(bào)文最后一個(gè)字節(jié)。如是,則認(rèn)為當(dāng)前報(bào)文與正則表達(dá)式規(guī)則不匹配,進(jìn)入步驟 312 ;如否,則進(jìn)入步驟302繼續(xù)取報(bào)文下一字節(jié)進(jìn)行比較。以下描述本發(fā)明實(shí)施例2圖8中的查找單元230的工作流程。圖10為本發(fā)明實(shí)施例2圖8所示的查找單元的工作流程圖。結(jié)合參閱圖8和圖 10,查找單元的工作流程包括如下步驟步驟400 判斷報(bào)文預(yù)處理單元220的字符和映射值是否準(zhǔn)備好。如是,則轉(zhuǎn)到步 驟402,否則繼續(xù)等待。步驟402 把當(dāng)前狀態(tài)設(shè)置為1(初始狀態(tài)值),并從報(bào)文預(yù)處理單元220讀入一字 節(jié)的報(bào)文數(shù)據(jù)和映射值。步驟404 每次查找開(kāi)始的第一字節(jié)數(shù)據(jù)都按照Char型數(shù)據(jù)處理,根據(jù)把當(dāng)前狀 態(tài)的地址以及該字節(jié)數(shù)據(jù)對(duì)應(yīng)的映射值,查找狀態(tài)遷移表得到下一狀態(tài)所在的地址。步驟406 根據(jù)下一狀態(tài)所在的地址判斷是否屬于接受態(tài)。如是,則轉(zhuǎn)到步驟424, 否則轉(zhuǎn)到步驟408。例如狀態(tài)地址為9bit時(shí),我們把所在的地址大于或等于OxlFS的狀態(tài)判定為接收態(tài)。狀態(tài)機(jī)一旦跳到一個(gè)接受態(tài),則認(rèn)為當(dāng)前報(bào)文與規(guī)則匹配成功。步驟408 根據(jù)下一狀態(tài)所在的地址判斷是否屬于失敗態(tài)。如是,則轉(zhuǎn)到步驟426, 否則轉(zhuǎn)到步驟410。當(dāng)下一狀態(tài)的狀態(tài)地址為0時(shí),判定下一狀態(tài)為失敗態(tài)。狀態(tài)機(jī)一旦跳 到一個(gè)失敗態(tài),則認(rèn)為當(dāng)前報(bào)文與規(guī)則匹配失敗。步驟410 下一狀態(tài)既不是接受態(tài)也不是失敗態(tài),還需要判斷當(dāng)前字節(jié)是否報(bào)文 最后一個(gè)字節(jié)。如是,則認(rèn)為當(dāng)前報(bào)文與規(guī)則不匹配,轉(zhuǎn)到步驟426 ;否則轉(zhuǎn)到步驟412。步驟412 接著結(jié)合R印Jiiin和Mr_min判斷下一狀態(tài)的類型。如果下一狀態(tài)所 在的地址大于等于R印Jiiin而小于則判斷為R印型,并轉(zhuǎn)到步驟416。否則轉(zhuǎn)到步 驟 414。步驟414 如果大于等于Mrjnin則判斷為Str型,轉(zhuǎn)到步驟318。否則判斷為char 型,轉(zhuǎn)到步驟420。步驟416:當(dāng)前數(shù)據(jù)屬于R印型數(shù)據(jù)。用前面所得的下一狀態(tài)地址,訪問(wèn)報(bào)文及DFA 表載入單元110中的狀態(tài)遷移表,讀出R印型屬性數(shù)據(jù),包括Exit_st,Count和Mask。然后 逐個(gè)字節(jié)讀出報(bào)文的映射值,判斷是否在Mask范圍內(nèi),如在Mask范圍內(nèi)則計(jì)數(shù)值加1。計(jì) 數(shù)值等于Count的值時(shí)表示重復(fù)的字符全部匹配,取Exit_st作為下一狀態(tài)地址,判斷類型 后繼續(xù)查找。當(dāng)前類型的數(shù)據(jù)處理完之后,轉(zhuǎn)到步驟422。此外,如果映射值不在Mask范圍內(nèi)時(shí),則讀取當(dāng)前不匹配字符對(duì)應(yīng)的映射值,根 據(jù)狀態(tài)遷移表得到下一狀態(tài)的地址,與接收態(tài)地址閾值和失敗態(tài)地址閾值進(jìn)行比較,在判 斷閾值范圍后進(jìn)行下一步相應(yīng)處理。步驟418:當(dāng)前數(shù)據(jù)屬于Str型數(shù)據(jù)。用前面所得的下一狀態(tài)地址,訪問(wèn)報(bào)文及DFA 表載入單元210中的狀態(tài)遷移表,讀出Str型屬性數(shù)據(jù),包括Exit_St,Mr_len和String。 然后逐個(gè)字節(jié)讀出報(bào)文字符值,與Mring中存儲(chǔ)的數(shù)據(jù)進(jìn)行比較,比較相等則計(jì)數(shù)值加1。 計(jì)數(shù)值等于時(shí)表示連續(xù)的字符全部匹配,取Exit_st作為下一狀態(tài)地址,判斷類型 后繼續(xù)查找。當(dāng)前類型的數(shù)據(jù)匹配處理完之后,轉(zhuǎn)到步驟422。另外,如果字符比較時(shí)不相等,則讀取當(dāng)前不匹配的字符對(duì)應(yīng)的映射值,根據(jù)狀態(tài) 遷移表得到下一狀態(tài)的地址,與接收態(tài)地址閾值和失敗態(tài)地址閾值進(jìn)行比較,在判斷閾值 范圍后進(jìn)行下一步相應(yīng)處理。步驟420 當(dāng)前數(shù)據(jù)屬于Char型數(shù)據(jù)。把查找狀態(tài)遷移表得到的下一狀態(tài)地址替 換成當(dāng)前狀態(tài)地址,重新讀入一字節(jié)的字符映射值,轉(zhuǎn)到步驟422。步驟422 從報(bào)文預(yù)處理單元220讀入下一字節(jié)的報(bào)文數(shù)值和映射值,繼續(xù)查找。步驟424 輸出匹配成功的結(jié)果,并通知緩存管理單元240釋放相應(yīng)的緩存。步驟426 輸出匹配失敗的結(jié)果,并通知緩存管理單元240釋放相應(yīng)的緩存。本發(fā)明實(shí)施例2的有益效果在于1、本發(fā)明實(shí)施例提供的引擎在查找時(shí)不需要回溯,匹配速度快。2、對(duì)原始DFA數(shù)據(jù)進(jìn)行了壓縮和優(yōu)化,使著結(jié)構(gòu)簡(jiǎn)潔,占用更小的儲(chǔ)存空間和更 小的邏輯資源或硬件資源,運(yùn)行速度進(jìn)一步加快,運(yùn)行頻率更高。3、硬件結(jié)構(gòu)精簡(jiǎn),容易實(shí)現(xiàn)多個(gè)正則表達(dá)式引擎并行工作來(lái)提高處理能力。尤其 適合10(ibpS以上的需求場(chǎng)景。4、與通用處理器或者網(wǎng)絡(luò)處理器配合,可實(shí)現(xiàn)以下功能報(bào)文過(guò)濾、攻擊防護(hù)、病毒檢測(cè)、垃圾郵件過(guò)濾、協(xié)議檢測(cè)、基于協(xié)議的流量監(jiān)控、定向廣告推送等。
盡管上面詳細(xì)例闡述了本發(fā)明的實(shí)施示例,但是本領(lǐng)域的計(jì)數(shù)人員將會(huì)理解,只 要把本發(fā)明做一些細(xì)節(jié)上的調(diào)整,就可以用在其他形式的環(huán)境中,而并沒(méi)有背離本發(fā)明的 精神和范圍。例如,本發(fā)明實(shí)施例也可以在通用的計(jì)算機(jī)上用純軟件的方式實(shí)現(xiàn);或者把需 要處理的表項(xiàng)內(nèi)容儲(chǔ)存在外部?jī)?chǔ)存器中使用;或者一部分功能使用軟件實(shí)現(xiàn)一部分使用硬 件實(shí)現(xiàn),等等。
權(quán)利要求
1.一種正則表達(dá)式匹配的方法,其特征在于,所述方法包括輸入待匹配報(bào)文及確定性有限自動(dòng)機(jī)DFA狀態(tài)表,所述DFA狀態(tài)表包括狀態(tài)遷移表,所 述狀態(tài)遷移表中包括正則表達(dá)式匹配過(guò)程中的所有狀態(tài)地址和各個(gè)狀態(tài)之間的遷移關(guān)系, 所述遷移關(guān)系包括匹配條件及符合匹配條件的下一狀態(tài);判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型,所述數(shù)據(jù)類型包括單個(gè)字符Char型和多個(gè)字符Str 型,所述Str型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)的多個(gè)字符;如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Str型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的多個(gè)字符值與 匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài);如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值 與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài);當(dāng)所述下一狀態(tài)為接受態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配成功結(jié)果。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述DFA狀態(tài)表還包括字符映射表,所述 字符映射表中包括字符值與映射值之間的映射關(guān)系;所述將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值與匹配條件進(jìn)行匹配處理,包括將待匹配 報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值的映射值與匹配條件進(jìn)行匹配處理。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述數(shù)據(jù)類型還包括重復(fù)字符Rep型, 所述Rep型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)出現(xiàn)多次的屬于一定范圍內(nèi)的多個(gè)字符;所述方法還包括判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型時(shí),如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Rep型,則將待匹 配報(bào)文中當(dāng)前狀態(tài)的映射值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條 件的下一狀態(tài)。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述匹配條件包括預(yù)先配置的Char型數(shù) 據(jù)的映射值,所述符合匹配條件的下一狀態(tài)是對(duì)應(yīng)于所述預(yù)先配置的Char型數(shù)據(jù)的映射 值和當(dāng)前狀態(tài)的狀態(tài)號(hào)的下一狀態(tài)的地址;所述將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值的映射值與匹配條件進(jìn)行匹配處理包括將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值對(duì)應(yīng)的映射值與預(yù)先配置的Char型數(shù)據(jù)的映 射值進(jìn)行比較,如一致,則根據(jù)當(dāng)前狀態(tài)的狀態(tài)號(hào)和當(dāng)前狀態(tài)的映射值,查詢所述狀態(tài)遷移 表以獲得下一狀態(tài)的地址,并遷移到下一狀態(tài)。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述匹配條件及符合匹配條件的下一狀 態(tài)包括Str型數(shù)據(jù)匹配條件以及符合Str型數(shù)據(jù)匹配條件的下一狀態(tài);其中,所述Str型 數(shù)據(jù)匹配條件包括存儲(chǔ)于MrLen字段中的預(yù)設(shè)字符個(gè)數(shù)nl,其中,nl為正整數(shù);以及存 儲(chǔ)于Mring字段中的預(yù)設(shè)的nl個(gè)字符各自的字符值;所述符合匹配條件的下一狀態(tài)包括 存儲(chǔ)于MrExitM字段中的Str型數(shù)據(jù)匹配成后遷移至下一狀態(tài)的地址;所述將待匹配報(bào)文中當(dāng)前狀態(tài)的多個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷 移所述符合匹配條件的下一狀態(tài)包括將待匹配報(bào)文中當(dāng)前狀態(tài)的nl個(gè)字符值,與Mring字段存儲(chǔ)的nl個(gè)字符值依次進(jìn)行 比較,當(dāng)全部相等時(shí),根據(jù)MrExitM字段指示的下一狀態(tài)的地址遷移到下一狀態(tài)。
6.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述匹配條件及符合匹配條件的下一狀 態(tài)包括R印型數(shù)據(jù)匹配條件以及符合R印型數(shù)據(jù)匹配條件的下一狀態(tài);其中,所述R印型數(shù)據(jù)匹配條件包括存儲(chǔ)于Count字段中的重復(fù)次數(shù)π2,其中,η2為正整數(shù);以及存儲(chǔ)于 Mask字段中的掩碼;所述符合R印型數(shù)據(jù)匹配條件的下一狀態(tài)存儲(chǔ)于R印ExitM字段中 的指示R印型數(shù)據(jù)匹配成功后遷移至下一狀態(tài)的地址;所述將待匹配報(bào)文中當(dāng)前狀態(tài)的映射值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至 所述符合匹配條件的下一狀態(tài)包括將待匹配報(bào)文中n2個(gè)字符分別對(duì)應(yīng)的映射值與Mask字段中的掩碼進(jìn)行比較,當(dāng)n2個(gè) 字符各自對(duì)應(yīng)的映射值全部在所述掩碼范圍內(nèi)時(shí),根據(jù)所述R印ExiUt字段指示的下一狀 態(tài)的地址遷移到下一狀態(tài)。
7.一種正則表達(dá)式匹配的裝置,其特征在于,所述裝置包括報(bào)文及DFA表載入單元,用于輸入待匹配報(bào)文及確定性有限自動(dòng)機(jī)DFA狀態(tài)表,所述 DFA狀態(tài)表包括狀態(tài)遷移表,所述狀態(tài)遷移表中包括正則表達(dá)式匹配過(guò)程中的所有狀態(tài)地 址和各個(gè)狀態(tài)之間的遷移關(guān)系,所述遷移關(guān)系包括匹配條件及符合匹配條件的下一狀態(tài);查找單元,包括數(shù)據(jù)類型確定模塊、匹配模塊及輸出模塊;所述數(shù)據(jù)類型確定模塊,用于判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型,所述數(shù)據(jù)類型包括單個(gè) 字符Char型和多個(gè)字符Str型,所述Str型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)的多個(gè)字符;所述匹配模塊,用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Str型,則將待匹配報(bào)文中當(dāng)前 狀態(tài)的多個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一 狀態(tài);如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值 與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀態(tài);所述輸出模塊,用于當(dāng)所述下一狀態(tài)為接受態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配成功結(jié)果。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述DFA狀態(tài)表還包括字符映射表,所述 字符映射表中包括字符值與映射值之間的映射關(guān)系;所述裝置還包括報(bào)文預(yù)處理單元,用于根據(jù)所述字符映射表對(duì)上述待匹配報(bào)文進(jìn)行映射處理,生成映 射值;所述匹配模塊,還用于將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值的映射值與匹配條件進(jìn) 行匹配處理。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述數(shù)據(jù)類型還包括重復(fù)字符Rep型, 所述Rep型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)出現(xiàn)多次的屬于一定范圍內(nèi)的多個(gè)字符;所述數(shù)據(jù)類型確定模塊,還用于判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型,所述數(shù)據(jù)類型包括單 個(gè)字符Char型、多個(gè)字符Str型和重復(fù)字符Rep型;所述匹配模塊,還用于如果當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型是Rep型,則將待匹配報(bào)文中當(dāng) 前狀態(tài)的映射值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至所述符合匹配條件的下一狀 態(tài)。
10.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述匹配條件包括預(yù)先配置的Char型數(shù) 據(jù)的映射值,所述符合匹配條件的下一狀態(tài)是對(duì)應(yīng)于所述預(yù)先配置的Char型數(shù)據(jù)的映射 值和當(dāng)前狀態(tài)的狀態(tài)號(hào)的下一狀態(tài)的地址;所述匹配模塊,具體用于將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值對(duì)應(yīng)的映射值與預(yù)先 配置的Char型數(shù)據(jù)的映射值進(jìn)行比較,如一致,則根據(jù)當(dāng)前狀態(tài)的狀態(tài)號(hào)和當(dāng)前狀態(tài)的映 射值,查詢所述狀態(tài)遷移表以獲得下一狀態(tài)的地址,并遷移到下一狀態(tài)。
11.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述匹配條件及符合匹配條件的下一狀 態(tài)包括Str型數(shù)據(jù)匹配條件以及符合Str型數(shù)據(jù)匹配條件的下一狀態(tài);其中,所述Str型 數(shù)據(jù)匹配條件包括存儲(chǔ)于MrLen字段中的預(yù)設(shè)字符個(gè)數(shù)nl,其中,nl為正整數(shù);以及存 儲(chǔ)于Mring字段中的預(yù)設(shè)的nl個(gè)字符各自的字符值;所述符合匹配條件的下一狀態(tài)包括 存儲(chǔ)于MrExitM字段中的Str型數(shù)據(jù)匹配成后遷移至下一狀態(tài)的地址;所述匹配模塊,具體用于將待匹配報(bào)文中當(dāng)前狀態(tài)的nl個(gè)字符值,與Mring字段存儲(chǔ) 的nl個(gè)字符值依次進(jìn)行比較,當(dāng)全部相等時(shí),根據(jù)StrExitM字段指示的下一狀態(tài)的地址 遷移到下一狀態(tài)。
12.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述匹配條件及符合匹配條件的下一狀 態(tài)包括R印型數(shù)據(jù)匹配條件以及符合R印型數(shù)據(jù)匹配條件的下一狀態(tài);其中,所述R印型 數(shù)據(jù)匹配條件包括存儲(chǔ)于Count字段中的重復(fù)次數(shù)π2,其中,η2為正整數(shù);以及存儲(chǔ)于 Mask字段中的掩碼;所述符合R印型數(shù)據(jù)匹配條件的下一狀態(tài)存儲(chǔ)于R印ExitM字段中 的指示R印型數(shù)據(jù)匹配成功后遷移至下一狀態(tài)的地址;所述匹配模塊,具體用于將待匹配報(bào)文中n2個(gè)字符分別對(duì)應(yīng)的映射值與Mask字段 中的掩碼進(jìn)行比較,當(dāng)n2個(gè)字符各自對(duì)應(yīng)的映射值全部在所述掩碼范圍內(nèi)時(shí),根據(jù)所述 RepExitSt字段指示的下一狀態(tài)的地址遷移到下一狀態(tài)。
13.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述匹配模塊,還用于將待匹配報(bào)文的 第一個(gè)字符的數(shù)據(jù)類型判斷為Char型。
14.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述報(bào)文及DFA表載入單元還包含緩存, 所述緩存包括隨機(jī)存取存儲(chǔ)器RAM,所述RAM用于存儲(chǔ)所述字符映射表和所述狀態(tài)遷移表。
15.根據(jù)權(quán)利要求14所述的裝置,其特征在于,所述裝置還包括緩存管理單元,用于 判斷和刷新所述緩存的空滿狀態(tài)并反饋給所述報(bào)文及DFA表載入單元。
全文摘要
本發(fā)明實(shí)施例提供了一種正則表達(dá)式匹配的方法及裝置,該方法包括輸入待匹配報(bào)文及DFA狀態(tài)表,DFA狀態(tài)表包括狀態(tài)遷移表,其包括正則表達(dá)式匹配過(guò)程中的所有狀態(tài)地址和各個(gè)狀態(tài)之間的遷移關(guān)系;判斷當(dāng)前狀態(tài)對(duì)應(yīng)的數(shù)據(jù)類型,包括單個(gè)字符Char型和多個(gè)字符Str型,Str型對(duì)應(yīng)的數(shù)據(jù)為連續(xù)的多個(gè)字符;若是Str型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的多個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至符合匹配條件的下一狀態(tài);若是Char型,則將待匹配報(bào)文中當(dāng)前狀態(tài)的單個(gè)字符值與匹配條件進(jìn)行匹配處理,當(dāng)匹配時(shí),遷移至符合匹配條件的下一狀態(tài);當(dāng)下一狀態(tài)為接受態(tài)時(shí),結(jié)束匹配過(guò)程并輸出匹配成功結(jié)果。該方法匹配速度快、效率高,DFA表項(xiàng)占用的存儲(chǔ)空間小。
文檔編號(hào)G06F17/30GK102142009SQ20101058083
公開(kāi)日2011年8月3日 申請(qǐng)日期2010年12月9日 優(yōu)先權(quán)日2010年12月9日
發(fā)明者付饒, 徐敏鋒, 時(shí)立峰, 段國(guó)蓮, 程貴鋒 申請(qǐng)人:華為技術(shù)有限公司