本發(fā)明涉及網(wǎng)絡(luò)安全技術(shù)領(lǐng)域,更具體地,涉及dfa壓縮方法及裝置、正則表達(dá)式匹配方法及系統(tǒng)。
背景技術(shù):
基于正則表達(dá)式的模式匹配,簡稱正則表達(dá)式匹配,是下一代防火墻(nextgenerationfirewall,ngfw)、入侵檢測/防御系統(tǒng)(intrusiondetectionsystems/intrusionpreventionsystem,ids/ips)、統(tǒng)一威脅管理(unifiedthreatmanagement,utm)等安全網(wǎng)關(guān)系統(tǒng)的關(guān)鍵模塊,而高性能的正則表達(dá)式匹配是其核心技術(shù)。正則表達(dá)式匹配通過檢查和處理tcp/ip協(xié)議應(yīng)用層的網(wǎng)包載荷(payload)對網(wǎng)包(packet)進(jìn)行監(jiān)控或者過濾。
正則表達(dá)式匹配主要通過確定型有窮自動(dòng)機(jī)(deterministicfiniteautomata,dfa)和非確定型有窮自動(dòng)機(jī)(undeterministicfiniteautomata,nfa)兩種數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)。其中,nfa內(nèi)存占用小,但匹配速度極慢,在多核或通用處理器平臺(tái)上根本不能滿足實(shí)際的網(wǎng)絡(luò)處理要求;而dfa匹配速度快,缺點(diǎn)是內(nèi)存占用過高。復(fù)雜的正則表達(dá)式集合可能引起dfa的狀態(tài)數(shù)量膨脹,導(dǎo)致需要巨大的儲(chǔ)存空間。
技術(shù)實(shí)現(xiàn)要素:
為解決正則表達(dá)式匹配中dfa內(nèi)存占用過高的問題,本發(fā)明提供了dfa壓縮方法及裝置、正則表達(dá)式匹配方法及系統(tǒng)。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種dfa壓縮方法,包括:
根據(jù)正則表達(dá)式集合構(gòu)造dfa,所述dfa包括:字符、狀態(tài)和每個(gè)狀態(tài)各自對應(yīng)于每個(gè)字符的轉(zhuǎn)移,對應(yīng)于每個(gè)字符,所述轉(zhuǎn)移從當(dāng)前狀態(tài)指向與該字符相應(yīng)的一個(gè)狀態(tài);
根據(jù)所述dfa中的相同轉(zhuǎn)移對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,其中所述相同轉(zhuǎn)移為指向同一狀態(tài)的轉(zhuǎn)移;
根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮。
具體地,所述根據(jù)所述dfa中的相同轉(zhuǎn)移對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,包括:
對于所述dfa中的每個(gè)狀態(tài),選取該狀態(tài)的相同轉(zhuǎn)移數(shù)目最多的轉(zhuǎn)移標(biāo)記為該狀態(tài)的第一狀態(tài)轉(zhuǎn)移,并將具有相同第一狀態(tài)轉(zhuǎn)移的狀態(tài)分組到一個(gè)第一狀態(tài)集合中;
對于每個(gè)所述第一狀態(tài)集合,將其中滿足預(yù)設(shè)條件的一個(gè)狀態(tài)標(biāo)記為第一狀態(tài),并將所述第一狀態(tài)再次分組到一個(gè)第二狀態(tài)集合中;其中,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)只有一個(gè),所述預(yù)設(shè)條件包括:第一狀態(tài)轉(zhuǎn)移的數(shù)目最多,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)有至少兩個(gè),則所述預(yù)設(shè)條件包括:在第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的前提下,深度最??;
對于所述第一狀態(tài)集合中剩余的每個(gè)狀態(tài),若判斷該狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符有相同轉(zhuǎn)移的數(shù)目大于該狀態(tài)的第一狀態(tài)轉(zhuǎn)移的數(shù)目,則將該狀態(tài)標(biāo)記為第二狀態(tài);
將所述第二狀態(tài)再次分組到所述第一狀態(tài)所在的第二狀態(tài)集合中,并將所述第二狀態(tài)的指向所述第一狀態(tài)的轉(zhuǎn)移標(biāo)記為第二狀態(tài)轉(zhuǎn)移;
將所述第一狀態(tài)集合中沒被再次分組的狀態(tài)組合成一個(gè)新的第一狀態(tài)集合,對所述新的第一狀態(tài)集合迭代執(zhí)行再次分組的步驟,直到所述第一狀態(tài)集合中的每個(gè)狀態(tài)都被再次分組到第二狀態(tài)集合中。
具體地,所述根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮,包括:
對于每個(gè)所述第一狀態(tài),保留該第一狀態(tài)的一個(gè)第一狀態(tài)轉(zhuǎn)移,將該第一狀態(tài)的不同于所述第一狀態(tài)轉(zhuǎn)移的轉(zhuǎn)移標(biāo)記為第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第一狀態(tài)的其他轉(zhuǎn)移不保留;
對于每個(gè)所述第二狀態(tài),保留該第二狀態(tài)的一個(gè)第二狀態(tài)轉(zhuǎn)移,將與所述第一狀態(tài)對應(yīng)同一字符的轉(zhuǎn)移不相同的轉(zhuǎn)移標(biāo)記為該第二狀態(tài)的第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第二狀態(tài)的其他轉(zhuǎn)移不保留。
具體地,所述根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮,還包括:
對于每個(gè)狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移,若對應(yīng)于連續(xù)的字符存在相同的第三狀態(tài)轉(zhuǎn)移,則對應(yīng)于該連續(xù)的字符僅保留一個(gè)第三狀態(tài)轉(zhuǎn)移。
根據(jù)本發(fā)明的第二方面,提供了一種基于所述dfa壓縮方法的正則表達(dá)式匹配方法,包括:
讀取壓縮后的所述dfa的當(dāng)前狀態(tài)和當(dāng)前輸入字符;
在所述當(dāng)前狀態(tài)的第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移;
若判斷存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則根據(jù)該第三狀態(tài)轉(zhuǎn)移將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);
若判斷不存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則通過判斷當(dāng)前狀態(tài)為第一狀態(tài)或第二狀態(tài),根據(jù)當(dāng)前狀態(tài)的第一狀態(tài)轉(zhuǎn)移或第二狀態(tài)轉(zhuǎn)移將當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。
根據(jù)本發(fā)明的第三方面,提供了一種dfa壓縮裝置,包括:
構(gòu)造單元,用于根據(jù)正則表達(dá)式集合構(gòu)造dfa,所述dfa包括:字符、狀態(tài)和每個(gè)狀態(tài)各自對應(yīng)于每個(gè)字符的轉(zhuǎn)移,對應(yīng)于每個(gè)字符,所述轉(zhuǎn)移從當(dāng)前狀態(tài)指向與該字符相應(yīng)的一個(gè)狀態(tài);
標(biāo)記單元,用于根據(jù)所述dfa中的相同轉(zhuǎn)移對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,其中所述相同轉(zhuǎn)移為指向同一狀態(tài)的轉(zhuǎn)移;
壓縮單元,用于根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮。
具體地,所述標(biāo)記單元包括:
第一標(biāo)記子單元,用于為所述dfa中的每個(gè)狀態(tài)選取該狀態(tài)的相同轉(zhuǎn)移數(shù)目最多的轉(zhuǎn)移標(biāo)記為該狀態(tài)的第一狀態(tài)轉(zhuǎn)移,并將具有相同第一狀態(tài)轉(zhuǎn)移的狀態(tài)分組到一個(gè)第一狀態(tài)集合中;
第二標(biāo)記子單元,用于將每個(gè)所述第一狀態(tài)集合中滿足預(yù)設(shè)條件的一個(gè)狀態(tài)標(biāo)記為第一狀態(tài),并將所述第一狀態(tài)再次分組到一個(gè)第二狀態(tài)集合中;其中,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)只有一個(gè),所述預(yù)設(shè)條件包括:第一狀態(tài)轉(zhuǎn)移的數(shù)目最多,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)有至少兩個(gè),則所述預(yù)設(shè)條件包括:在第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的前提下,深度最??;
第三標(biāo)記子單元,用于判斷所述第一狀態(tài)集合中剩余的每個(gè)狀態(tài),若該狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符有相同轉(zhuǎn)移的數(shù)目大于該狀態(tài)的第一狀態(tài)轉(zhuǎn)移的數(shù)目,則將該狀態(tài)標(biāo)記為第二狀態(tài);還用于將所述第二狀態(tài)再次分組到所述第一狀態(tài)所在的第二狀態(tài)集合中,并將所述第二狀態(tài)的指向所述第一狀態(tài)的轉(zhuǎn)移標(biāo)記為第二狀態(tài)轉(zhuǎn)移;
迭代子單元,用于將所述第一狀態(tài)集合中沒被再次分組的狀態(tài)組合成一個(gè)新的第一狀態(tài)集合,并將所述新的第一狀態(tài)集合發(fā)送到所述第一標(biāo)記子單元和第二標(biāo)記子單元以迭代執(zhí)行再次分組的步驟,直到所述第一狀態(tài)集合中的每個(gè)狀態(tài)都被再次分組到第二狀態(tài)集合中。
具體地,所述壓縮單元具體用于:
對于每個(gè)所述第一狀態(tài),保留該第一狀態(tài)的一個(gè)第一狀態(tài)轉(zhuǎn)移,將該第一狀態(tài)的不同于所述第一狀態(tài)轉(zhuǎn)移的轉(zhuǎn)移標(biāo)記為第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第一狀態(tài)的其他轉(zhuǎn)移不保留;
對于每個(gè)所述第二狀態(tài),保留該第二狀態(tài)的一個(gè)第二狀態(tài)轉(zhuǎn)移,將與所述第一狀態(tài)對應(yīng)同一字符的轉(zhuǎn)移不相同的轉(zhuǎn)移標(biāo)記為該第二狀態(tài)的第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第二狀態(tài)的其他轉(zhuǎn)移不保留。
具體地,所述壓縮單元還具體用于:
對于每個(gè)狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移,若對應(yīng)于連續(xù)的字符存在相同的第三狀態(tài)轉(zhuǎn)移,則對應(yīng)于該連續(xù)的字符僅保留一個(gè)第三狀態(tài)轉(zhuǎn)移。
根據(jù)本發(fā)明的第四方面,提供了一種正則表達(dá)式匹配系統(tǒng),包括所述dfa壓縮裝置以及讀取單元、匹配單元,其中:
讀取單元,用于讀取壓縮后的所述dfa的當(dāng)前狀態(tài)和當(dāng)前輸入字符;
匹配單元,用于在所述當(dāng)前狀態(tài)的第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移;
若判斷存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則根據(jù)該第三狀態(tài)轉(zhuǎn)移將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);
若判斷不存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則通過判斷當(dāng)前狀態(tài)為第一狀態(tài)或第二狀態(tài),根據(jù)當(dāng)前狀態(tài)的第一狀態(tài)轉(zhuǎn)移或第二狀態(tài)轉(zhuǎn)移將當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。
本發(fā)明提供的技術(shù)方案通過對dfa中的狀態(tài)和狀態(tài)的轉(zhuǎn)移進(jìn)行標(biāo)記,根據(jù)狀態(tài)的標(biāo)記和轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮,在不影響查找速率的情況下能達(dá)到較高的壓縮率,使dfa占用更少內(nèi)存。
附圖說明
圖1為dfa狀態(tài)轉(zhuǎn)移圖和狀態(tài)轉(zhuǎn)移表;
圖2為又一dfa狀態(tài)轉(zhuǎn)移圖和狀態(tài)轉(zhuǎn)移表;
圖3為本發(fā)明實(shí)施例提供的dfa壓縮方法流程圖;
圖4為本發(fā)明又一實(shí)施例提供的dfa壓縮方法流程圖;
圖5為前端dfa壓縮后的效果圖;
圖6為后端dfa壓縮后的效果圖;
圖7為本發(fā)明實(shí)施例提供的dfa壓縮裝置結(jié)構(gòu)圖;
圖8為本發(fā)明又一實(shí)施例提供的dfa壓縮裝置結(jié)構(gòu)圖;
圖9為本發(fā)明實(shí)施例提供的正則表達(dá)式匹配系統(tǒng)結(jié)構(gòu)圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例,對本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說明本發(fā)明,但不用來限制本發(fā)明的范圍。
dfa由不同類型的片段構(gòu)造,如全部由正則表達(dá)式拆分得到的字符串片段構(gòu)造的dfa、全部由錨定的字符串片段或只含單個(gè)混沌因子的錨定片段構(gòu)造的dfa等。其中,混沌因子定義為符號組合“.*”、“[^□]*”、“.+”、“[^□]+”、“.{□}”或“[^□]{□}”。
對于由字符串片段構(gòu)造的dfa,也稱為前端dfa,片段的語法是串接。如圖1所示,圖1為字符串片段“fil”、“cmd”和“url”對應(yīng)的dfa狀態(tài)轉(zhuǎn)移圖和狀態(tài)轉(zhuǎn)移表。對于每個(gè)串接字符,dfa都會(huì)存在對應(yīng)于所述串接字符的狀態(tài)的前向轉(zhuǎn)移,所述前向轉(zhuǎn)移從深度低的狀態(tài)指向深度高的狀態(tài)。除了這些前向轉(zhuǎn)移之外,其它的轉(zhuǎn)移基本上都是指向初始狀態(tài)或者初始狀態(tài)的相鄰狀態(tài)的后向轉(zhuǎn)移,所述后向轉(zhuǎn)移從深度高的狀態(tài)指向深度低的狀態(tài)。
例如,圖1所示的dfa狀態(tài)轉(zhuǎn)移表中,表的上方為字符,表的左側(cè)為dfa的狀態(tài)及狀態(tài)對應(yīng)的深度,如2/1表示狀態(tài)2的深度為1,表中的數(shù)字表示每個(gè)狀態(tài)對應(yīng)于不同字符的轉(zhuǎn)移指向的狀態(tài)。所有的轉(zhuǎn)移對應(yīng)于字符‘f’、‘c’和‘u’都會(huì)分別指向狀態(tài)1、2或3,狀態(tài)1、2和3都是狀態(tài)0的相鄰狀態(tài)。除了前向轉(zhuǎn)移和指向狀態(tài)0的相鄰狀態(tài)的轉(zhuǎn)移,其他轉(zhuǎn)移都指向狀態(tài)0。因此,dfa狀態(tài)轉(zhuǎn)移表中大部分狀態(tài)的轉(zhuǎn)移都是相同的,所述轉(zhuǎn)移集中指向狀態(tài)0、1、2和3。
由錨定的字符串片段或者只含單個(gè)混沌因子的錨定片段構(gòu)造的dfa,也稱為后端dfa。后端dfa中片段的語法中不僅包含串接,而且包含錨定以及混沌因子。如圖2所示,圖2為錨定片段集合“^e=[^&]*\.exe”、“^=[^\n]{6}”、“^=[^\n]{3,5}”和“^\.com”對應(yīng)的dfa狀態(tài)轉(zhuǎn)移圖和狀態(tài)轉(zhuǎn)移表。其中,錨定會(huì)使得所有狀態(tài)都含有指向死狀態(tài)的轉(zhuǎn)移,而且對于含有對應(yīng)串接字符的前向轉(zhuǎn)移的狀態(tài),錨定使該狀態(tài)其余的轉(zhuǎn)移都指向死狀態(tài)。此外,混沌因子“[^□]*”會(huì)產(chǎn)生一個(gè)中間狀態(tài),所述中間狀態(tài)及其后續(xù)狀態(tài)對于字符集合“[^□]”中的字符幾乎都會(huì)指向該中間狀態(tài)。而對于混沌因子“[^□]{□}”,它能產(chǎn)生一條狀態(tài)鏈,鏈中每個(gè)狀態(tài)含有的對應(yīng)于“[^□]”中的字符的前向轉(zhuǎn)移都指向該狀態(tài)在鏈中的相鄰狀態(tài)。因?yàn)榛煦缫蜃佣紩?huì)有一個(gè)范圍很大的“[^□]”,所以狀態(tài)鏈中各個(gè)狀態(tài)內(nèi)的轉(zhuǎn)移對于大部分字符是相同的,而各個(gè)狀態(tài)間的轉(zhuǎn)移對于大部分字符是不同的,只要包含在“[^□]”中就不同。所述狀態(tài)內(nèi)的轉(zhuǎn)移為對于每個(gè)狀態(tài),該狀態(tài)的轉(zhuǎn)移。所述狀態(tài)間的轉(zhuǎn)移為狀態(tài)間對應(yīng)于同一字符的轉(zhuǎn)移。
例如,圖2中,錨定使得dfa中的所有狀態(tài)都含有指向死狀態(tài)11的轉(zhuǎn)移,而且對于狀態(tài)10、12、14、17、20、23和28,它們對應(yīng)于除串接字符以外的其他字符的轉(zhuǎn)移都指向死狀態(tài)11?;煦缫蜃印癧^\&]*”產(chǎn)生了中間狀態(tài)15,使得狀態(tài)15、18、21、24和26對應(yīng)于除字符‘&’和‘\.’以外的其他字符的非前向轉(zhuǎn)移都指向中間狀態(tài)15。混沌因子“[^\n]{6}”產(chǎn)生了狀態(tài)鏈13、16、19、22、25和27,使得這些狀態(tài)中與字符‘\n’以外的其他字符所對應(yīng)的轉(zhuǎn)移都指向下一個(gè)相鄰狀態(tài),即狀態(tài)16、19、22、25、27和28。混沌因子“[^\n]{6}”產(chǎn)生的狀態(tài)鏈中狀態(tài)間的轉(zhuǎn)移大部分是不同的,如狀態(tài)13和16。不同混沌因子“[^\n]{6}”中的狀態(tài)和“[^\&]*”的狀態(tài)間的轉(zhuǎn)移大部分也不同,如狀態(tài)13和15,而其他情況下狀態(tài)間的轉(zhuǎn)移大部分是相同的,如狀態(tài)11和12、狀態(tài)15和18。
綜上,對于前端dfa中的每個(gè)狀態(tài),存在該狀態(tài)對應(yīng)于每個(gè)字符指向初始狀態(tài)的轉(zhuǎn)移,即狀態(tài)內(nèi)的轉(zhuǎn)移一致性,以及狀態(tài)間對應(yīng)于同一字符一致指向初始狀態(tài)以及初始狀態(tài)的相鄰狀態(tài)的轉(zhuǎn)移,即狀態(tài)間的轉(zhuǎn)移一致性。而對于后端dfa,串接的字符會(huì)帶來狀態(tài)內(nèi)和狀態(tài)間一致指向死狀態(tài)的轉(zhuǎn)移,即狀態(tài)內(nèi)和狀態(tài)間的轉(zhuǎn)移一致性;混沌因子“[^□]*”始終會(huì)產(chǎn)生中間狀態(tài),并使得串接的字符帶來狀態(tài)內(nèi)一致指向該中間狀態(tài)的轉(zhuǎn)移,即狀態(tài)內(nèi)的轉(zhuǎn)移一致性,以及狀態(tài)間一致指向該中間狀態(tài)、該中間狀態(tài)的相鄰狀態(tài)和死狀態(tài)的轉(zhuǎn)移,即狀態(tài)間的轉(zhuǎn)移一致性;混沌因子“[^□]{□}”始終會(huì)產(chǎn)生狀態(tài)鏈,并帶來狀態(tài)內(nèi)一致指向狀態(tài)鏈中相鄰狀態(tài)的轉(zhuǎn)移,即狀態(tài)內(nèi)的轉(zhuǎn)移一致性和狀態(tài)間的轉(zhuǎn)移區(qū)分性。
以上由于正則表達(dá)式的拆分特性使得狀態(tài)的大量相同轉(zhuǎn)移都是冗余的,本發(fā)明提出了dfa壓縮方法及裝置、正則表達(dá)式匹配方法及系統(tǒng),最大程度地去除這些冗余的轉(zhuǎn)移,從而壓縮了正則表達(dá)式構(gòu)造的dfa。但本發(fā)明不限于用于對以上兩種dfa片段進(jìn)行壓縮,對于其他dfa片段中由相同轉(zhuǎn)移帶來的冗余問題,本發(fā)明普遍適用。
下面對dfa進(jìn)行介紹:
dfa實(shí)際上為自動(dòng)狀態(tài)機(jī),由多個(gè)狀態(tài)、轉(zhuǎn)移邊和每個(gè)狀態(tài)的輸入組成。所述狀態(tài)用圓圈中的數(shù)字表示,所述轉(zhuǎn)移邊用箭頭表示,所述狀態(tài)的輸入用箭頭上的字符表示。dfa的特點(diǎn)是對于每一個(gè)狀態(tài),確定的輸入一定有一個(gè)確定的輸出。如圖1所示的狀態(tài)0下,輸入f一定會(huì)轉(zhuǎn)移到狀態(tài)1。使用dfa進(jìn)行匹配時(shí),先指定狀態(tài)集合中的某一個(gè)狀態(tài)為起始狀態(tài),分析器從起始狀態(tài)開始,每讀入一個(gè)字符就修改一次狀態(tài),將當(dāng)前狀態(tài)的下一個(gè)狀態(tài)重置為當(dāng)前狀態(tài)。分析器在讀完所有字符后,會(huì)停留在一個(gè)確定的狀態(tài),如果這個(gè)狀態(tài)與期望的狀態(tài)一致,則所述分析器接收了所述字符串,否則所述分析器拒絕了所述字符串。
圖3為本發(fā)明實(shí)施例提供的dfa壓縮方法流程圖,如圖3所示,包括:s1,根據(jù)正則表達(dá)式集合構(gòu)造dfa,所述dfa包括:字符、狀態(tài)和每個(gè)狀態(tài)各自對應(yīng)于每個(gè)字符的轉(zhuǎn)移,對應(yīng)于每個(gè)字符,所述轉(zhuǎn)移從當(dāng)前狀態(tài)指向與該字符相應(yīng)的一個(gè)狀態(tài);s2,根據(jù)所述dfa中的相同轉(zhuǎn)移對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,其中所述相同轉(zhuǎn)移為指向同一狀態(tài)的轉(zhuǎn)移;s3,根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮。
具體地,s1中的所述正則表達(dá)式一般包括表述匹配次數(shù)的量詞、表述具體位置的錨點(diǎn)和字符串,用于表示字符串集合的規(guī)則。在進(jìn)行正則表達(dá)式匹配之前需要將正則表達(dá)式轉(zhuǎn)換成機(jī)器能閱讀的有限自動(dòng)機(jī)。dfa的狀態(tài)轉(zhuǎn)移表是一張二維表,如圖1和圖2所示,包括字符、狀態(tài)和每個(gè)狀態(tài)各自對應(yīng)于每個(gè)字符的轉(zhuǎn)移。對應(yīng)于每個(gè)字符,所述轉(zhuǎn)移從當(dāng)前狀態(tài)指向與該字符相應(yīng)的一個(gè)狀態(tài)。s2中所述相同轉(zhuǎn)移為指向同一狀態(tài)的轉(zhuǎn)移,根據(jù)所述相同轉(zhuǎn)移對所述dfa中狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,所述標(biāo)記用于區(qū)分狀態(tài)和轉(zhuǎn)移。s3中根據(jù)狀態(tài)的標(biāo)記和轉(zhuǎn)移的標(biāo)記對不同狀態(tài)的不同轉(zhuǎn)移進(jìn)行不同壓縮,所述壓縮為去除相同轉(zhuǎn)移,從而減少dfa中的數(shù)據(jù)。
例如,圖1所示的dfa狀態(tài)轉(zhuǎn)移表包括狀態(tài)1-9,字符c、d、f、i、l、m、r、u和其他字符,以及狀態(tài)0-9各自對應(yīng)于每個(gè)字符的轉(zhuǎn)移。對應(yīng)于每個(gè)字符,所述轉(zhuǎn)移從當(dāng)前狀態(tài)指向與該字符相應(yīng)的一個(gè)狀態(tài),如當(dāng)前狀態(tài)為0,對應(yīng)于字符f,所述轉(zhuǎn)移從狀態(tài)0指向狀態(tài)1。圖1所示的dfa狀態(tài)轉(zhuǎn)移表中存在指向狀態(tài)0、1、2和3的相同轉(zhuǎn)移,根據(jù)所述相同轉(zhuǎn)移對所述dfa中狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記。
本實(shí)施例根據(jù)dfa中的相同轉(zhuǎn)移對dfa中的狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,根據(jù)狀態(tài)的標(biāo)記和轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮,去除了dfa中冗余的轉(zhuǎn)移,使dfa占用更少內(nèi)存。需要說明的是,對于其他情況下存在的由相同狀態(tài)轉(zhuǎn)移帶來的冗余問題,本實(shí)施例也能解決,不限于本實(shí)施例所列舉的情況。
圖4為本發(fā)明又一實(shí)施例提供的dfa壓縮方法流程圖,如圖4所示,在上述實(shí)施例的基礎(chǔ)上,本實(shí)施例中所述根據(jù)所述dfa中的相同轉(zhuǎn)移對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,包括:s21,對于所述dfa中的每個(gè)狀態(tài),選取該狀態(tài)的相同轉(zhuǎn)移數(shù)目最多的轉(zhuǎn)移標(biāo)記為該狀態(tài)的第一狀態(tài)轉(zhuǎn)移,并將具有相同第一狀態(tài)轉(zhuǎn)移的狀態(tài)分組到一個(gè)第一狀態(tài)集合中;s22,對于每個(gè)所述第一狀態(tài)集合,將其中滿足預(yù)設(shè)條件的一個(gè)狀態(tài)標(biāo)記為第一狀態(tài),并將所述第一狀態(tài)再次分組到一個(gè)第二狀態(tài)集合中;其中,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)只有一個(gè),所述預(yù)設(shè)條件包括:第一狀態(tài)轉(zhuǎn)移的數(shù)目最多,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)有至少兩個(gè),則所述預(yù)設(shè)條件包括:在第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的前提下,深度最??;s23,對于所述第一狀態(tài)集合中剩余的每個(gè)狀態(tài),若判斷該狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符有相同轉(zhuǎn)移的數(shù)目大于該狀態(tài)的第一狀態(tài)轉(zhuǎn)移的數(shù)目,則將該狀態(tài)標(biāo)記為第二狀態(tài);s24,將所述第二狀態(tài)再次分組到所述第一狀態(tài)所在的第二狀態(tài)集合中,并將所述第二狀態(tài)的指向所述第一狀態(tài)的轉(zhuǎn)移標(biāo)記為第二狀態(tài)轉(zhuǎn)移;s25,將所述第一狀態(tài)集合中沒被再次分組的狀態(tài)組合成一個(gè)新的第一狀態(tài)集合,對所述新的第一狀態(tài)集合迭代執(zhí)行再次分組的步驟,直到所述第一狀態(tài)集合中的每個(gè)狀態(tài)都被分組到某一個(gè)第二狀態(tài)集合中。
具體地,在s21中,所述第一狀態(tài)轉(zhuǎn)移指一個(gè)狀態(tài)轉(zhuǎn)移到相同狀態(tài)的轉(zhuǎn)移數(shù)目最多的轉(zhuǎn)移,也可以限定為一個(gè)狀態(tài)轉(zhuǎn)移到相同狀態(tài)的轉(zhuǎn)移數(shù)目大于預(yù)設(shè)閾值的轉(zhuǎn)移。選取狀態(tài)的第一狀態(tài)轉(zhuǎn)移后,判斷狀態(tài)的第一狀態(tài)轉(zhuǎn)移是否相同,將具有相同第一狀態(tài)轉(zhuǎn)移的狀態(tài)分組到一個(gè)集合中,所述集合為第一狀態(tài)集合。如果一個(gè)狀態(tài)的第一狀態(tài)轉(zhuǎn)移與其他狀態(tài)的第一狀態(tài)轉(zhuǎn)移都不同,則將所述狀態(tài)單獨(dú)分組到一個(gè)第一狀態(tài)集合中。
在s22中,對于每個(gè)所述第一狀態(tài)集合,其中第一狀態(tài)轉(zhuǎn)移數(shù)目最多的狀態(tài)可能有一個(gè)或多個(gè),若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)只有一個(gè)時(shí),將該狀態(tài)標(biāo)記為第一狀態(tài)。若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)有至少兩個(gè)時(shí),在第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)中選擇深度最小的一個(gè)狀態(tài)標(biāo)記為第一狀態(tài)。所述深度為一個(gè)狀態(tài)在狀態(tài)轉(zhuǎn)移圖中的層次為該狀態(tài)的深度,其中初始狀態(tài)的層次為0層。將標(biāo)記的第一狀態(tài)再次單獨(dú)分組到一個(gè)第二狀態(tài)集合中。
在s23中,從所述第一狀態(tài)集合中的剩余狀態(tài)中選擇第二狀態(tài)并標(biāo)記,所述第二狀態(tài)的選擇標(biāo)準(zhǔn)為與所述第一狀態(tài)對應(yīng)同一字符具有相同轉(zhuǎn)移的數(shù)目大于各自的第一狀態(tài)轉(zhuǎn)移數(shù)目。從中可以看出所述第二狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符具有的相同轉(zhuǎn)移中除了第一狀態(tài)轉(zhuǎn)移外,一定還包括其他相同轉(zhuǎn)移。
在s24中,將滿足所述選擇標(biāo)準(zhǔn)的第二狀態(tài)再次分組到所述第一狀態(tài)所在的第二狀態(tài)集合中。并將所述第二狀態(tài)指向所述第一狀態(tài)的轉(zhuǎn)移標(biāo)記為第二狀態(tài)轉(zhuǎn)移。
在s25中,一輪分組后,將所述第一狀態(tài)集合中沒被再次分組的狀態(tài)重新組合成一個(gè)新的第一狀態(tài)集合,對所述新的第一狀態(tài)集合迭代再次分組的步驟,直到所述第一狀態(tài)集合中的每個(gè)狀態(tài)都被再次分組到某一個(gè)第二狀態(tài)集合中。第二狀態(tài)集合可能為一個(gè)第一狀態(tài)單獨(dú)組成的集合,也可能為第一狀態(tài)和第二狀態(tài)組成的集合。對每個(gè)狀態(tài)進(jìn)行兩次分組是為了對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記。
例如,圖1中,所有狀態(tài)的第一狀態(tài)轉(zhuǎn)移相同,將所有狀態(tài)分組到一個(gè)第一狀態(tài)集合中。狀態(tài)0、7、8、9的第一狀態(tài)轉(zhuǎn)移數(shù)目最多,為6個(gè),但狀態(tài)0的深度最小,為0,所以狀態(tài)0被標(biāo)記為第一狀態(tài)。將狀態(tài)0再次分組到一個(gè)新的集合中,所述新的集合為第二狀態(tài)集合。對于除狀態(tài)0以外的其他每個(gè)狀態(tài),與狀態(tài)0對應(yīng)于同一字符具有相同轉(zhuǎn)移的數(shù)目為8或9大于它們自身的核心轉(zhuǎn)移數(shù)目為5或6。因此,將狀態(tài)1-9標(biāo)記為第二狀態(tài),并分組到狀態(tài)0所在的第二狀態(tài)集合中,將狀態(tài)1-9指向狀態(tài)0的轉(zhuǎn)移標(biāo)記為第二狀態(tài)轉(zhuǎn)移。經(jīng)過一輪分組,所有的狀態(tài)都被分組。
圖2中,除狀態(tài)15、18、21、24和26組成的第二狀態(tài)集合以外。其他的每個(gè)第二狀態(tài)集合僅僅包含單個(gè)狀態(tài)。對于由狀態(tài)10、11、12、14、17、20、23和28,它們沒有被分組到一個(gè)第二狀態(tài)集合中,這是因?yàn)楸M管它們具有相同的第一狀態(tài)轉(zhuǎn)移,即指向狀態(tài)11的轉(zhuǎn)移,但它們與狀態(tài)11對應(yīng)于同一字符具有相同轉(zhuǎn)移的數(shù)目。
本發(fā)明實(shí)施例對于所述dfa中的每個(gè)狀態(tài)進(jìn)行兩次分組,根據(jù)分組結(jié)果對每個(gè)狀態(tài)和每個(gè)轉(zhuǎn)移進(jìn)行標(biāo)記,根據(jù)標(biāo)記結(jié)果對dfa進(jìn)行壓縮,去除了dfa中大量的相同轉(zhuǎn)移,使dfa占用更少的內(nèi)存。
在上述實(shí)施例的基礎(chǔ)上,本發(fā)明實(shí)施例中所述根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮,包括:對于每個(gè)所述第一狀態(tài),保留該第一狀態(tài)的一個(gè)第一狀態(tài)轉(zhuǎn)移,將該第一狀態(tài)的不同于所述第一狀態(tài)轉(zhuǎn)移的轉(zhuǎn)移標(biāo)記為第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第一狀態(tài)的其他轉(zhuǎn)移不保留;對于每個(gè)所述第二狀態(tài),保留該第二狀態(tài)的一個(gè)第二狀態(tài)轉(zhuǎn)移,將與所述第一狀態(tài)對應(yīng)同一字符的轉(zhuǎn)移不相同的轉(zhuǎn)移標(biāo)記為該第二狀態(tài)的第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第二狀態(tài)的其他轉(zhuǎn)移不保留。
具體地,一個(gè)第一狀態(tài)的第一狀態(tài)轉(zhuǎn)移指向同一狀態(tài),對于每個(gè)所述第一狀態(tài),將該第一狀態(tài)的不同于所述第一狀態(tài)轉(zhuǎn)移的轉(zhuǎn)移標(biāo)記為該第一狀態(tài)的第三狀態(tài)轉(zhuǎn)移,保留該第一狀態(tài)的一個(gè)第一狀態(tài)轉(zhuǎn)移和第三狀態(tài)轉(zhuǎn)移,該第一狀態(tài)的其他轉(zhuǎn)移不保留。一個(gè)第二狀態(tài)的第二狀態(tài)轉(zhuǎn)移都指向一個(gè)第一狀態(tài)。對于每個(gè)第二狀態(tài),將該第二狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符的轉(zhuǎn)移不相同的轉(zhuǎn)移標(biāo)記為該第二狀態(tài)的第三狀態(tài)轉(zhuǎn)移,保留該第二狀態(tài)的一個(gè)第二狀態(tài)轉(zhuǎn)移和第三狀態(tài)轉(zhuǎn)移,該第二狀態(tài)的其他轉(zhuǎn)移不保留。不保留的轉(zhuǎn)移被去除掉,減少了所述dfa的數(shù)據(jù)。所述第一狀態(tài)轉(zhuǎn)移、所述第二狀態(tài)轉(zhuǎn)移和所述第三狀態(tài)轉(zhuǎn)移都有一個(gè)標(biāo)記。其中,所述第三狀態(tài)轉(zhuǎn)移中有一個(gè)ascii字符,用于匹配輸入字符進(jìn)行對應(yīng)狀態(tài)的轉(zhuǎn)移。所述第一狀態(tài)轉(zhuǎn)移和所述第二狀態(tài)轉(zhuǎn)移有一個(gè)區(qū)分標(biāo)記,用于區(qū)分所述第一狀態(tài)轉(zhuǎn)移和所述第二狀態(tài)轉(zhuǎn)移。
圖5為前端dfa壓縮后的效果圖,如圖5所示,第一列中沒有星號的轉(zhuǎn)移為所述第一狀態(tài)轉(zhuǎn)移,對應(yīng)的狀態(tài)為所述第一狀態(tài)。第一列中有星號的轉(zhuǎn)移為所述第二狀態(tài)轉(zhuǎn)移,對應(yīng)的狀態(tài)為所述第二狀態(tài)。其它的轉(zhuǎn)移為所述第三狀態(tài)轉(zhuǎn)移。箭頭表示所述第二狀態(tài)指向所述第一狀態(tài)。狀態(tài)0為第一狀態(tài),為狀態(tài)0保留一個(gè)第一狀態(tài)轉(zhuǎn)移,即從狀態(tài)0指向狀態(tài)0的轉(zhuǎn)移,以及不同于所述第一狀態(tài)轉(zhuǎn)移的第三狀態(tài)轉(zhuǎn)移,即對應(yīng)字符c、f、i,從狀態(tài)0分別指向狀態(tài)2、1和3的轉(zhuǎn)移。狀態(tài)1-9為第二狀態(tài),所述第二狀態(tài)的第二狀態(tài)轉(zhuǎn)移指向第一狀態(tài),分別為所述第二狀態(tài)保留一個(gè)第二狀態(tài)轉(zhuǎn)移,即一個(gè)指向狀態(tài)0的轉(zhuǎn)移。并為所述第二狀態(tài)分別保留與狀態(tài)0對應(yīng)同一字符的轉(zhuǎn)移不相同的第三狀態(tài)轉(zhuǎn)移,如對于狀態(tài)1,保留對應(yīng)字符i指向狀態(tài)4的轉(zhuǎn)移。
圖6為后端dfa壓縮后的效果圖,如圖6所示,狀態(tài)15、18、21、24和26組成一個(gè)第一狀態(tài)集合,其他的狀態(tài)各自單獨(dú)組成一個(gè)第一狀態(tài)集合。狀態(tài)15為第一狀態(tài),為狀態(tài)15保留一個(gè)第一狀態(tài)轉(zhuǎn)移,即從狀態(tài)15轉(zhuǎn)移到狀態(tài)15,以及不同于所述第一狀態(tài)轉(zhuǎn)移的第三狀態(tài)轉(zhuǎn)移,即對于字符\n、\.,狀態(tài)15分別轉(zhuǎn)移到狀態(tài)11和18。狀態(tài)18、21、24和26為第二狀態(tài),所述第二狀態(tài)的第二狀態(tài)轉(zhuǎn)移指向狀態(tài)15,分別為所述第二狀態(tài)保留一個(gè)第二狀態(tài)轉(zhuǎn)移,即一個(gè)指向狀態(tài)15的轉(zhuǎn)移。并為所述第二狀態(tài)分別保留與狀態(tài)15對應(yīng)同一字符的轉(zhuǎn)移不相同的第三狀態(tài)轉(zhuǎn)移,如對于狀態(tài)18,保留對應(yīng)字符e指向狀態(tài)21的轉(zhuǎn)移。對于其他僅由一個(gè)第一狀態(tài)組成的第一狀態(tài)集合,為所述第一狀態(tài)保留一個(gè)第一狀態(tài)轉(zhuǎn)移,如從狀態(tài)10指向狀態(tài)11的轉(zhuǎn)移,以及不同于所述第一狀態(tài)轉(zhuǎn)移的第三狀態(tài)轉(zhuǎn)移,如對應(yīng)字符e從狀態(tài)10指向狀態(tài)12的轉(zhuǎn)移
對于壓縮后的dfa,每個(gè)狀態(tài)的轉(zhuǎn)移大大減少,前端dfa的壓縮率rc為(9×10-19)/(9×10)≈79%,字符數(shù)|σ|=9。后端dfa的壓縮率rc為(10×19-37)/(10×19)≈81%,字符數(shù)|σ|=10。在實(shí)際應(yīng)用中,字符數(shù)|σ|=256,對于dfa的壓縮率可以達(dá)到96%以上。與壓縮前的dfa相比,根據(jù)公式(nfdfa+nbdfa)*|σ|*(1-rc)*(log2(nfdfa+nbdfa)+8)計(jì)算壓縮前后dfa的內(nèi)存占用大小。其中,nfdfa為前端dfa中的狀態(tài)數(shù),nbdfa為后端dfa中的狀態(tài)數(shù),rc為壓縮率,假設(shè)nfdfa+nbdfa=65536,rc=99%,壓縮前后的dfa內(nèi)存占用分別為32mb和492kb,減少了幾乎兩個(gè)數(shù)量級的內(nèi)存占用。
本實(shí)施例對所述第一狀態(tài)和所述第二狀態(tài)的轉(zhuǎn)移進(jìn)行不同方式的保留,對于所述第一狀態(tài),消除了狀態(tài)內(nèi)的冗余。對于所述第二狀態(tài),既消除了狀態(tài)內(nèi)的冗余,也消除了狀態(tài)間的冗余,具有較高的壓縮率。
在上述實(shí)施例的基礎(chǔ)上,本實(shí)施例中所述根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮,還包括:對于每個(gè)狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移,若對應(yīng)于連續(xù)的字符存在相同的第三狀態(tài)轉(zhuǎn)移,則對應(yīng)于該連續(xù)的字符僅保留一個(gè)第三狀態(tài)轉(zhuǎn)移。
具體地,對于每個(gè)狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移,如果對應(yīng)于連續(xù)的字符存在相同的第三狀態(tài)轉(zhuǎn)移,則可以將相同的第三狀態(tài)轉(zhuǎn)移合并為一個(gè)字符范圍的第三狀態(tài)轉(zhuǎn)移。字符是否連續(xù)可以根據(jù)字符對應(yīng)的ascii碼判斷。
例如,一個(gè)第二狀態(tài)41的第二狀態(tài)轉(zhuǎn)移指向狀態(tài)40,第三狀態(tài)轉(zhuǎn)移為(a,41)、(b,41)、(c,41)、(e,42)、(f,41)和(g,41),第二狀態(tài)41的第三狀態(tài)轉(zhuǎn)移可以進(jìn)一步壓縮為([a,c],41)、([e,e],42)和([f,g],41)。其中[a,c]表示字符范圍,是兩個(gè)8比特的值,左邊值表示范圍下限為a,字符a對應(yīng)的ascii碼數(shù)值為65。右邊值表示范圍上限是c,字符c對應(yīng)的ascii碼數(shù)值為67。在進(jìn)行匹配時(shí),按順序比較查找,比如在狀態(tài)41中查找對應(yīng)字符f的轉(zhuǎn)移,先比較標(biāo)記轉(zhuǎn)移([a,c],41)中的字符范圍[a,c],判斷獲知f的ascii碼數(shù)值比c的ascii碼數(shù)值大,繼續(xù)比較([e,e],42)中的字符范圍[e,e],判斷獲知f的ascii碼數(shù)值比e的ascii碼數(shù)值大,繼續(xù)比較([f,g],41)中的[f,g],發(fā)現(xiàn)f在[f,g]的端點(diǎn),當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)41。本實(shí)施例中的情況是普遍存在的,通過對每個(gè)狀態(tài)的第三狀態(tài)轉(zhuǎn)移進(jìn)行壓縮,進(jìn)一步提高了dfa的壓縮率。
本實(shí)施例提供了一種基于所述dfa壓縮方法的正則表達(dá)式匹配方法,包括:讀取壓縮后的所述dfa的當(dāng)前狀態(tài);在所述當(dāng)前狀態(tài)的第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移;若判斷存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則根據(jù)該第三狀態(tài)轉(zhuǎn)移將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);若判斷不存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則通過判斷當(dāng)前狀態(tài)為第一狀態(tài)或第二狀態(tài),根據(jù)當(dāng)前狀態(tài)的第一狀態(tài)轉(zhuǎn)移或第二狀態(tài)轉(zhuǎn)移將當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。
具體地,所述通過判斷當(dāng)前狀態(tài)為第一狀態(tài)或第二狀態(tài),根據(jù)當(dāng)前狀態(tài)的第一狀態(tài)轉(zhuǎn)移或第二狀態(tài)轉(zhuǎn)移將當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài),包括:當(dāng)所述當(dāng)前狀態(tài)為第一狀態(tài)時(shí),根據(jù)所述當(dāng)前狀態(tài)的第一狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);當(dāng)所述當(dāng)前狀態(tài)為第二狀態(tài)時(shí),根據(jù)所述當(dāng)前狀態(tài)的第二狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到所述第二狀態(tài)轉(zhuǎn)移指向的所述第一狀態(tài),在所述第一狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移;若存在所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移,則根據(jù)對應(yīng)于所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);若不存在所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移,則根據(jù)所述第二狀態(tài)轉(zhuǎn)移指向的所述第一狀態(tài)的第一狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。
例如,根據(jù)圖5中壓縮的前端dfa對當(dāng)前輸入字符進(jìn)行匹配,如果當(dāng)前狀態(tài)為0,當(dāng)前輸入字符為‘f’,在狀態(tài)0的第三狀態(tài)轉(zhuǎn)移中查找輸入字符‘f’的第三狀態(tài)轉(zhuǎn)移,判斷存在對應(yīng)于輸入字符‘f’的第三狀態(tài)轉(zhuǎn)移,將當(dāng)前狀態(tài)0轉(zhuǎn)移到狀態(tài)1。如果當(dāng)前狀態(tài)為3,當(dāng)前輸入字符為‘r’,在狀態(tài)3的第三狀態(tài)轉(zhuǎn)移中查找輸入字符‘r’的第三狀態(tài)轉(zhuǎn)移,判斷存在對應(yīng)于輸入字符‘r’的第三狀態(tài)轉(zhuǎn)移,將當(dāng)前狀態(tài)3轉(zhuǎn)移到狀態(tài)6。如果當(dāng)前狀態(tài)為0,當(dāng)前輸入字符為‘d’,在狀態(tài)0的第三狀態(tài)轉(zhuǎn)移中查找輸入字符‘d’的第三狀態(tài)轉(zhuǎn)移,判斷存在輸入字符‘d’的第三狀態(tài)轉(zhuǎn)移,判斷狀態(tài)0為第一狀態(tài),根據(jù)狀態(tài)0的第一狀態(tài)轉(zhuǎn)移,將當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。如果當(dāng)前狀態(tài)為2,當(dāng)前輸入字符為‘c’,在狀態(tài)2的第三狀態(tài)轉(zhuǎn)移中查找輸入字符‘c’的第三狀態(tài)轉(zhuǎn)移,判斷不存在輸入字符‘c’的第三狀態(tài)轉(zhuǎn)移,判斷狀態(tài)2為第二狀態(tài),根據(jù)狀態(tài)2的第二狀態(tài)轉(zhuǎn)移將狀態(tài)2轉(zhuǎn)移到所述第二狀態(tài)轉(zhuǎn)移指向的狀態(tài)0,在狀態(tài)0的所述第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于字符‘c’的所述第三狀態(tài)轉(zhuǎn)移,判斷存在對應(yīng)于字符‘c’的第三狀態(tài)轉(zhuǎn)移,則根據(jù)該第三狀態(tài)轉(zhuǎn)移,將當(dāng)前狀態(tài)轉(zhuǎn)移到狀態(tài)2。如果當(dāng)前狀態(tài)為3,當(dāng)前輸入字符為‘d’。在狀態(tài)3的第三狀態(tài)轉(zhuǎn)移中查找輸入字符‘d’的第三狀態(tài)轉(zhuǎn)移,判斷不存在輸入字符‘d’的第三狀態(tài)轉(zhuǎn)移,判斷狀態(tài)3為第二狀態(tài),根據(jù)狀態(tài)3的第二狀態(tài)轉(zhuǎn)移將狀態(tài)3轉(zhuǎn)移到所述第二狀態(tài)轉(zhuǎn)移指向的狀態(tài)0,在狀態(tài)0的所述第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于字符‘d’的所述第三狀態(tài)轉(zhuǎn)移,判斷不存在對應(yīng)于字符‘d’的所述第三狀態(tài)轉(zhuǎn)移,則根據(jù)狀態(tài)0的第一狀態(tài)轉(zhuǎn)移,將當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。
綜上所述,在非壓縮的dfa中,對應(yīng)于當(dāng)前輸入字符的狀態(tài)轉(zhuǎn)移能夠直接在當(dāng)前狀態(tài)找到并執(zhí)行,然而對于本實(shí)施例中壓縮后的dfa,根據(jù)當(dāng)前狀態(tài)找到對應(yīng)于當(dāng)前輸入字符的狀態(tài)轉(zhuǎn)移有且只有5種可能且互斥的情況:
情形1,對于當(dāng)前的第一狀態(tài),對應(yīng)當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移被找到并執(zhí)行。比如圖3中當(dāng)前狀態(tài)為0,當(dāng)前輸入字符為‘f’;
情形2,對于當(dāng)前的第一狀態(tài),沒有對應(yīng)當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,即成為第一狀態(tài)轉(zhuǎn)移而被壓縮,第一狀態(tài)轉(zhuǎn)移被找到并執(zhí)行。比如圖3中當(dāng)前狀態(tài)為0,當(dāng)前輸入字符為‘d’;
情形3,對于當(dāng)前的第二狀態(tài),對應(yīng)當(dāng)前字符的第三狀態(tài)轉(zhuǎn)移被找到并執(zhí)行。比如圖3中當(dāng)前狀態(tài)為3,當(dāng)前輸入字符為‘r’;
情形4,對于當(dāng)前的第二狀態(tài),沒有對應(yīng)當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,即成為第一狀態(tài)轉(zhuǎn)移而被壓縮,指向第一狀態(tài)的第一狀態(tài)轉(zhuǎn)移首先被執(zhí)行,之后轉(zhuǎn)到情形1。比如圖3中當(dāng)前狀態(tài)為2,當(dāng)前輸入字符為‘c’;
情形5,對于當(dāng)前的第二狀態(tài),沒有對應(yīng)當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,即成為第一狀態(tài)轉(zhuǎn)移而被壓縮,指向第一狀態(tài)的第一狀態(tài)轉(zhuǎn)移首先被執(zhí)行,之后轉(zhuǎn)到情形2。比如圖3中當(dāng)前狀態(tài)為3,當(dāng)前輸入字符為‘d’。
上述情形1、2、3只需要一次狀態(tài)訪問,而情形4、5需要兩次狀態(tài)訪問。因?yàn)楸景l(fā)明實(shí)施例中根據(jù)當(dāng)前狀態(tài)找到對應(yīng)于當(dāng)前輸入字符的狀態(tài)轉(zhuǎn)移有且只有5種可能且互斥的情況,所以本發(fā)明實(shí)施例最壞情況下的狀態(tài)訪問次數(shù)為確定的2次,能夠保證最壞的匹配處理性能。
本實(shí)施例提供的基于所述dfa壓縮方法的正則表達(dá)式匹配方法,在使用壓縮后的dfa進(jìn)行匹配時(shí)不影響查找速率。
圖7為本發(fā)明實(shí)施例提供的dfa壓縮裝置結(jié)構(gòu)圖,如圖7所示,包括構(gòu)造單元71、標(biāo)記單元72和壓縮單元73,其中:
構(gòu)造單元71用于根據(jù)正則表達(dá)式集合構(gòu)造dfa,所述dfa包括:字符、狀態(tài)和每個(gè)狀態(tài)各自對應(yīng)于每個(gè)字符的轉(zhuǎn)移,對應(yīng)于每個(gè)字符,所述轉(zhuǎn)移從當(dāng)前狀態(tài)指向與該字符相應(yīng)的一個(gè)狀態(tài);標(biāo)記單元72用于根據(jù)所述dfa中的相同轉(zhuǎn)移對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,其中所述相同轉(zhuǎn)移為指向同一狀態(tài)的轉(zhuǎn)移;壓縮單元73用于根據(jù)所述狀態(tài)的標(biāo)記和所述轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮。
具體地,所述正則表達(dá)式一般包括表述匹配次數(shù)的量詞、表述具體位置的錨點(diǎn)和字符串,用于表示字符串集合的規(guī)則。在進(jìn)行正則表達(dá)式匹配之前所述構(gòu)造單元71需要將正則表達(dá)式轉(zhuǎn)換成機(jī)器能閱讀的有限自動(dòng)機(jī)。dfa的狀態(tài)轉(zhuǎn)移表是一張二維表,如圖1和圖2所示,包括字符、狀態(tài)和每個(gè)狀態(tài)各自對應(yīng)于每個(gè)字符的轉(zhuǎn)移。對應(yīng)于每個(gè)字符,所述轉(zhuǎn)移從當(dāng)前狀態(tài)指向與該字符相應(yīng)的一個(gè)狀態(tài)。所述相同轉(zhuǎn)移為指向同一狀態(tài)的轉(zhuǎn)移,所述標(biāo)記單元72根據(jù)所述相同轉(zhuǎn)移對所述dfa中狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,所述標(biāo)記用于區(qū)分狀態(tài)和轉(zhuǎn)移。所述壓縮單元73根據(jù)狀態(tài)的標(biāo)記和轉(zhuǎn)移的標(biāo)記對不同狀態(tài)的不同轉(zhuǎn)移進(jìn)行不同壓縮,所述壓縮了為去除相同轉(zhuǎn)移,從而減少dfa中的數(shù)據(jù)。本實(shí)施例的舉例參考方法中對應(yīng)的舉例,此處不再贅述。
本實(shí)施例中標(biāo)記單元根據(jù)dfa中的相同轉(zhuǎn)移對dfa中的狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記,壓縮單元根據(jù)狀態(tài)的標(biāo)記和轉(zhuǎn)移的標(biāo)記對所述dfa進(jìn)行壓縮,去除了dfa中冗余的轉(zhuǎn)移,使dfa占用更少內(nèi)存。
在上述實(shí)施例的基礎(chǔ)上,圖8為本發(fā)明實(shí)施例提供的dfa壓縮裝置結(jié)構(gòu)圖,如圖8所示,所述標(biāo)記單元72包括所述標(biāo)記單元包括第一標(biāo)記子單元721、第二標(biāo)記子單元722、第三標(biāo)記子單元723和迭代子單元724,其中:
所述第一標(biāo)記子單元721用于為所述dfa中的每個(gè)狀態(tài)選取該狀態(tài)的相同轉(zhuǎn)移數(shù)目最多的轉(zhuǎn)移標(biāo)記為該狀態(tài)的第一狀態(tài)轉(zhuǎn)移,并將具有相同第一狀態(tài)轉(zhuǎn)移的狀態(tài)分組到一個(gè)第一狀態(tài)集合中;所述第二標(biāo)記子單元722用于將每個(gè)所述第一狀態(tài)集合中滿足預(yù)設(shè)條件的一個(gè)狀態(tài)標(biāo)記為第一狀態(tài),并將所述第一狀態(tài)再次分組到一個(gè)第二狀態(tài)集合中;其中,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)只有一個(gè),所述預(yù)設(shè)條件包括:第一狀態(tài)轉(zhuǎn)移的數(shù)目最多,若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)有至少兩個(gè),則所述預(yù)設(shè)條件包括:在第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的前提下,深度最??;所述第三標(biāo)記子單元用于723判斷所述第一狀態(tài)集合中剩余的每個(gè)狀態(tài),若該狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符有相同轉(zhuǎn)移的數(shù)目大于該狀態(tài)的第一狀態(tài)轉(zhuǎn)移的數(shù)目,則將該狀態(tài)標(biāo)記為第二狀態(tài);還用于將所述第二狀態(tài)再次分組到所述第一狀態(tài)所在的第二狀態(tài)集合中,并將所述第二狀態(tài)的指向所述第一狀態(tài)的轉(zhuǎn)移標(biāo)記為第二狀態(tài)轉(zhuǎn)移;所述迭代子單元724用于將所述第一狀態(tài)集合中沒被再次分組的狀態(tài)組合成一個(gè)新的第一狀態(tài)集合,并將所述新的第一狀態(tài)集合發(fā)送到所述第二標(biāo)記子單元和第三標(biāo)記子單元以迭代執(zhí)行再次分組的步驟,直到所述第一狀態(tài)集合中的每個(gè)狀態(tài)都被再次分組到第二狀態(tài)集合中。
具體地,所述第一狀態(tài)轉(zhuǎn)移指一個(gè)狀態(tài)轉(zhuǎn)移到相同狀態(tài)的轉(zhuǎn)移數(shù)目最多的轉(zhuǎn)移,也可以限定為一個(gè)狀態(tài)轉(zhuǎn)移到相同狀態(tài)的轉(zhuǎn)移數(shù)目大于預(yù)設(shè)閾值的轉(zhuǎn)移。所述第一標(biāo)記單元721選取狀態(tài)的第一狀態(tài)轉(zhuǎn)移后,判斷狀態(tài)的第一狀態(tài)轉(zhuǎn)移是否相同,將具有相同第一狀態(tài)轉(zhuǎn)移的狀態(tài)分組到一個(gè)集合中,所述集合為第一狀態(tài)集合。如果一個(gè)狀態(tài)的第一狀態(tài)轉(zhuǎn)移與其他狀態(tài)的第一狀態(tài)轉(zhuǎn)移都不同,則所述第一標(biāo)記單元721將所述狀態(tài)單獨(dú)分組到一個(gè)第一狀態(tài)集合中。
對于每個(gè)所述第一狀態(tài)集合,其中第一狀態(tài)轉(zhuǎn)移數(shù)目最多的狀態(tài)可能有一個(gè)或多個(gè),若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)只有一個(gè)時(shí),所述第二標(biāo)記單元722將該狀態(tài)標(biāo)記為第一狀態(tài)。若判斷第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)有至少兩個(gè)時(shí),所述第二標(biāo)記單元722在第一狀態(tài)轉(zhuǎn)移的數(shù)目最多的狀態(tài)中選擇深度最小的一個(gè)狀態(tài)標(biāo)記為第一狀態(tài),并將標(biāo)記的第一狀態(tài)再次單獨(dú)分組到一個(gè)第二狀態(tài)集合中。
所述第三標(biāo)記單元723從所述第一狀態(tài)集合中的剩余狀態(tài)中選擇第二狀態(tài)并標(biāo)記,所述第二狀態(tài)的選擇標(biāo)準(zhǔn)為與所述第一狀態(tài)對應(yīng)同一字符具有相同轉(zhuǎn)移的數(shù)目大于各自的第一狀態(tài)轉(zhuǎn)移數(shù)目。從中可以看出所述第二狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符具有的相同轉(zhuǎn)移中除了第一狀態(tài)轉(zhuǎn)移外,一定還包括其他相同轉(zhuǎn)移。
所述第三標(biāo)記單元723將滿足所述選擇標(biāo)準(zhǔn)的第二狀態(tài)再次分組到所述第一狀態(tài)所在的第二狀態(tài)集合中,并將所述第二狀態(tài)指向所述第一狀態(tài)的轉(zhuǎn)移標(biāo)記為第二狀態(tài)轉(zhuǎn)移。
一輪分組后,所述迭代單元724將所述第一狀態(tài)集合中沒被再次分組的狀態(tài)重新組合成一個(gè)新的第一狀態(tài)集合,對所述新的第一狀態(tài)集合迭代再次分組的步驟,直到所述第一狀態(tài)集合中的每個(gè)狀態(tài)都被再次分組到某一個(gè)第二狀態(tài)集合中。第二狀態(tài)集合可能為一個(gè)第一狀態(tài)單獨(dú)組成的集合,也可能為第一狀態(tài)和第二狀態(tài)組成的集合。對每個(gè)狀態(tài)進(jìn)行兩次分組是為了對狀態(tài)和轉(zhuǎn)移進(jìn)行標(biāo)記。本實(shí)施例的舉例參考方法中對應(yīng)的舉例,此處不再贅述。
本實(shí)施例對于所述dfa中的每個(gè)狀態(tài)進(jìn)行兩次分組,根據(jù)分組結(jié)果對每個(gè)狀態(tài)和每個(gè)轉(zhuǎn)移進(jìn)行標(biāo)記,根據(jù)標(biāo)記結(jié)果對dfa進(jìn)行壓縮,去除了dfa中大量的相同轉(zhuǎn)移,使dfa占用更少的內(nèi)存。
在上述實(shí)施例的基礎(chǔ)上,本發(fā)明實(shí)施例中壓縮單元73具體用于對于每個(gè)所述第一狀態(tài),保留該第一狀態(tài)的一個(gè)第一狀態(tài)轉(zhuǎn)移,將該第一狀態(tài)的不同于所述第一狀態(tài)轉(zhuǎn)移的轉(zhuǎn)移標(biāo)記為第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第一狀態(tài)的其他轉(zhuǎn)移不保留;對于每個(gè)所述第二狀態(tài),保留該第二狀態(tài)的一個(gè)第二狀態(tài)轉(zhuǎn)移,將與所述第一狀態(tài)對應(yīng)同一字符的轉(zhuǎn)移不相同的轉(zhuǎn)移標(biāo)記為該第二狀態(tài)的第三狀態(tài)轉(zhuǎn)移,并保留所述第三狀態(tài)轉(zhuǎn)移,該第二狀態(tài)的其他轉(zhuǎn)移不保留。
具體地,一個(gè)第一狀態(tài)的第一狀態(tài)轉(zhuǎn)移指向同一狀態(tài),對于每個(gè)所述第一狀態(tài),壓縮單元73將該第一狀態(tài)的不同于所述第一狀態(tài)轉(zhuǎn)移的轉(zhuǎn)移標(biāo)記為該第一狀態(tài)的第三狀態(tài)轉(zhuǎn)移,保留該第一狀態(tài)的一個(gè)第一狀態(tài)轉(zhuǎn)移和第三狀態(tài)轉(zhuǎn)移,該第一狀態(tài)的其他第一狀態(tài)轉(zhuǎn)移不保留。一個(gè)第二狀態(tài)的第二狀態(tài)轉(zhuǎn)移都指向一個(gè)第一狀態(tài),對于每個(gè)第二狀態(tài),壓縮單元73將該第二狀態(tài)與所述第一狀態(tài)對應(yīng)同一字符的轉(zhuǎn)移不相同的轉(zhuǎn)移標(biāo)記為該第二狀態(tài)的第三狀態(tài)轉(zhuǎn)移,保留該第二狀態(tài)的一個(gè)第二狀態(tài)轉(zhuǎn)移和第三狀態(tài)轉(zhuǎn)移,該第二狀態(tài)的其他轉(zhuǎn)移不保留。不保留的轉(zhuǎn)移被去除掉,減少了所述dfa中的數(shù)據(jù)。所述第一狀態(tài)轉(zhuǎn)移、所述第二狀態(tài)轉(zhuǎn)移和所述第三狀態(tài)轉(zhuǎn)移都有一個(gè)標(biāo)記。其中,所述第三狀態(tài)轉(zhuǎn)移中有一個(gè)ascii字符,用于匹配輸入字符進(jìn)行對應(yīng)狀態(tài)的轉(zhuǎn)移。所述第一狀態(tài)轉(zhuǎn)移和所述第二狀態(tài)轉(zhuǎn)移有一個(gè)區(qū)分標(biāo)記,用于區(qū)分所述第一狀態(tài)轉(zhuǎn)移和所述第二狀態(tài)轉(zhuǎn)移。本實(shí)施例的舉例參考方法中對應(yīng)的舉例,此處不再贅述。
本實(shí)施例對所述第一狀態(tài)和所述第二狀態(tài)的轉(zhuǎn)移進(jìn)行不同方式的保留,對于所述第一狀態(tài),消除了狀態(tài)內(nèi)的冗余。對于所述第二狀態(tài),既消除了狀態(tài)內(nèi)的冗余,也消除了狀態(tài)間的冗余,具有較高的壓縮率。
在上述實(shí)施例的基礎(chǔ)上,本實(shí)施例中的壓縮單元73還具體用于對于每個(gè)狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移,若對應(yīng)于連續(xù)的字符存在相同的第三狀態(tài)轉(zhuǎn)移,則對應(yīng)于該連續(xù)的字符僅保留一個(gè)第三狀態(tài)轉(zhuǎn)移。
具體地,對于每個(gè)狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移,如果對應(yīng)于連續(xù)的字符存在相同的第三狀態(tài)轉(zhuǎn)移,則壓縮單元73可以將相同的第三狀態(tài)轉(zhuǎn)移合并為一個(gè)字符范圍的第三狀態(tài)轉(zhuǎn)移。字符是否連續(xù)可以根據(jù)字符對應(yīng)的ascii碼判斷。本實(shí)施例的舉例參考方法中對應(yīng)的舉例,此處不再贅述。本實(shí)施例中的情況是普遍存在的,通過對每個(gè)狀態(tài)的第三狀態(tài)轉(zhuǎn)移進(jìn)行壓縮,進(jìn)一步提高了dfa的壓縮率。
圖9為本發(fā)明實(shí)施例提供的正則表達(dá)式匹配系統(tǒng)結(jié)構(gòu)圖,如圖9所示,包括所述壓縮裝置以及讀取單元74、匹配單元75,其中:讀取單元74用于讀取壓縮后的所述確定有限自動(dòng)機(jī)的當(dāng)前狀態(tài)和當(dāng)前輸入字符;匹配單元75用于在所述當(dāng)前狀態(tài)的第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移;若判斷存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則根據(jù)該第三狀態(tài)轉(zhuǎn)移將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);若判斷不存在對應(yīng)于所述當(dāng)前輸入字符的第三狀態(tài)轉(zhuǎn)移,則通過判斷當(dāng)前狀態(tài)為第一狀態(tài)或第二狀態(tài),根據(jù)當(dāng)前狀態(tài)的第一狀態(tài)轉(zhuǎn)移或第二狀態(tài)轉(zhuǎn)移將當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。
具體地,所述匹配單元75具體用于當(dāng)所述當(dāng)前狀態(tài)為第一狀態(tài)時(shí),根據(jù)所述當(dāng)前狀態(tài)的第一狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);當(dāng)所述當(dāng)前狀態(tài)為第二狀態(tài)時(shí),根據(jù)所述當(dāng)前狀態(tài)的第二狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到所述第二狀態(tài)轉(zhuǎn)移指向的所述第一狀態(tài),在所述第一狀態(tài)的所述第三狀態(tài)轉(zhuǎn)移中查找對應(yīng)于所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移;若存在所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移,則根據(jù)對應(yīng)于所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài);若不存在所述當(dāng)前輸入字符的所述第三狀態(tài)轉(zhuǎn)移,則根據(jù)所述第二狀態(tài)轉(zhuǎn)移指向的所述第一狀態(tài)的第一狀態(tài)轉(zhuǎn)移,將所述當(dāng)前狀態(tài)轉(zhuǎn)移到下一個(gè)狀態(tài)。本實(shí)施例的舉例參考方法中對應(yīng)的舉例,此處不再贅述。本實(shí)施例最壞情況下的狀態(tài)訪問次數(shù)為確定的兩次,能夠保證最壞的匹配處理性能。本實(shí)施例提供的正則表達(dá)式匹配系統(tǒng),在使用壓縮后的dfa進(jìn)行匹配時(shí)不影響查找速率。
本發(fā)明提出的dfa壓縮方法及裝置、正則表達(dá)式匹配方法及系統(tǒng),并不局限于網(wǎng)絡(luò)安全、網(wǎng)絡(luò)監(jiān)控和網(wǎng)絡(luò)過濾領(lǐng)域,凡是基于內(nèi)容的網(wǎng)絡(luò)處理服務(wù)或者涉及到利用給定特征來匹配給定內(nèi)容的應(yīng)用,都能使用基于本發(fā)明提出的正則表達(dá)式壓縮、匹配方法進(jìn)行優(yōu)化處理,比如海量數(shù)據(jù)的查找和分類、web搜索、文本編輯中的查找替換等。
最后,本申請的方法僅為較佳的實(shí)施方案,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。