專(zhuān)利名稱(chēng):一種規(guī)則匹配方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信技術(shù)領(lǐng)域,具體涉及一種規(guī)則匹配方法及裝置。
背景技術(shù):
規(guī)則匹配技術(shù)作為一種關(guān)鍵的特征字識(shí)別技術(shù),廣泛地應(yīng)用于IP網(wǎng)絡(luò)深度 報(bào)文檢測(cè)(De印Packet Inspection,DPI)當(dāng)中。其中,特征字識(shí)別即對(duì)報(bào)文中一 些特定的字符串進(jìn)行識(shí)別,這些特定的字符串會(huì)用一些特殊的規(guī)則來(lái)表示,通常會(huì)使 用正則表達(dá)式(Regular Expression)來(lái)表示這些特定的字符串,例如,正則表達(dá)式 to (nite I knight | night)用于表示需要匹配的字符串為tonite或toknight或tonight。所 謂規(guī)則匹配即通過(guò)在給定的字符串當(dāng)中查找是否存在符合這些正則表達(dá)式的目標(biāo)字符串?,F(xiàn)有技術(shù)中提供了一種規(guī)則匹配方法,該方法包括1、接收輸入的規(guī)則,該規(guī)則包括偏移位置及字符串;2、狀態(tài)機(jī)匹配引擎根據(jù)上述的字符串在狀態(tài)機(jī)中完成規(guī)則匹配并輸出匹配結(jié) 果;3、位置計(jì)數(shù)器根據(jù)上述的偏移位置計(jì)算計(jì)算該規(guī)則的偏移量;例如,該規(guī)則的偏移位置為0,當(dāng)輸入該規(guī)則的第一個(gè)字符時(shí),位置計(jì)數(shù)器計(jì)算值 為0 ;當(dāng)接收到字符串中的第二個(gè)字符時(shí),位置計(jì)數(shù)器計(jì)算值為1 ;……;依此類(lèi)推,直到接 收完該規(guī)則所有的字符為止,位置計(jì)數(shù)器的累計(jì)值即為該規(guī)則的偏移量。4、規(guī)則匹配結(jié)果模塊將位置計(jì)數(shù)器計(jì)算的該規(guī)則的偏移量與狀態(tài)機(jī)匹配引擎匹 配到的規(guī)則的偏移量進(jìn)行比較,如果相等,則整個(gè)規(guī)則匹配成功,否則,整個(gè)規(guī)則匹配失敗。發(fā)明人在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在如下問(wèn)題當(dāng)輸入的規(guī)則有大量的較短的規(guī)則時(shí),例如\x00\x00\x00 (代表16進(jìn)制的三個(gè) 零,因?yàn)椴皇强晌谋撅@示的字符,所以使用\χ進(jìn)行轉(zhuǎn)義表達(dá)),在實(shí)際規(guī)則匹配中極易匹配 到,狀態(tài)機(jī)匹配引擎會(huì)有大量的匹配結(jié)果輸出,而匹配結(jié)果經(jīng)過(guò)偏移量的過(guò)濾后剩下的有 效匹配卻很少,導(dǎo)致了大量的無(wú)效的匹配。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例中提供一種規(guī)則匹配方法及裝置,能夠提高規(guī)則匹配的效率。一種規(guī)則匹配方法,包括接收字符串中的字符以及所述字符在所述字符串中的位置信息;根據(jù)所述字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹配,所述狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件 包括字符以及位置信息;根據(jù)匹配輸出匹配結(jié)果。一種規(guī)則匹配裝置,包括接收單元,用于接收字符串中的字符以及所述字符在所述字符串中的位置信息;匹配單元,用于根據(jù)所述字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹配,并根據(jù)匹配輸出匹配結(jié)果;所述狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件包括字符以及位置信息。與現(xiàn)有的技術(shù)相比,本發(fā)明實(shí)施例具有以下有益效果本發(fā)明實(shí)施例中,將字符以及位置信息作為狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件,進(jìn)而在 接收到字符以及該字符在字符串中的位置信息后,可以在狀態(tài)機(jī)中進(jìn)行匹配并輸出匹配結(jié) 果。利用本發(fā)明實(shí)施例提供的規(guī)則匹配方法,即使字符串中包含多個(gè)相同的規(guī)則,也無(wú)需 輸出多個(gè)匹配結(jié)果,而僅輸出與跳轉(zhuǎn)條件中的字符以及位置信息對(duì)應(yīng)的規(guī)則的匹配結(jié)果即 可。與現(xiàn)有技術(shù)相比,本發(fā)明實(shí)施例可以減少無(wú)效匹配結(jié)果的輸出,提高規(guī)則匹配的效率。
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例中所 需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施 例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲 得其他的附圖。圖1為本發(fā)明實(shí)施例中提供的一種規(guī)則匹配方法的流程圖;圖2為本發(fā)明實(shí)施例中提供的一種狀態(tài)機(jī)生成方法的流程圖;圖3為本發(fā)明實(shí)施例中提供的一種狀態(tài)機(jī)的示意圖;圖4為本發(fā)明實(shí)施例中提供的一種狀態(tài)機(jī)生成方法的流程圖;圖5為本發(fā)明實(shí)施例中提供的一種規(guī)則匹配方法的流程圖;圖6為本發(fā)明實(shí)施例中提供的另一種狀態(tài)機(jī)的示意圖;圖7為本發(fā)明實(shí)施例中提供的另一種狀態(tài)機(jī)的示意圖;圖8為本發(fā)明實(shí)施例中提供的另一種狀態(tài)機(jī)的示意圖;圖9為本發(fā)明實(shí)施例中提供的一種規(guī)則匹配裝置的結(jié)構(gòu)圖;圖10為本發(fā)明實(shí)施例中提供的另一種規(guī)則匹配裝置的結(jié)構(gòu)圖。
具體實(shí)施例方式下面將結(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ù)的范圍。實(shí)施例一請(qǐng)參閱圖1,圖1為本發(fā)明實(shí)施例中提供的一種規(guī)則匹配方法的流程圖。如圖1所 示,該方法可以包括以下步驟101、接收字符串中的字符以及該字符在字符串中的位置信息;其中,字符串的輸入可以是字符格式的,例如“EXample”,這類(lèi)字符串可以表示 所有的可顯示的ASCII碼;另外,字符串的輸入也可以是用\xhh轉(zhuǎn)義的ASCII碼,例如 “\x01\x02\x0a”,這類(lèi)字符串主要是用于表示無(wú)法顯示的ASCII碼,例如,回車(chē),換行等。其中,位置信息的輸入可以是任意的進(jìn)制。例如,例如\d(ddd)代表十進(jìn)制數(shù)(ddd 代表具體的數(shù)值),\x(hhh)代表16進(jìn)制數(shù)(hhh代表具體的數(shù)值)。如果只有兩位,可以 不用“ 0 ”。例如\dl0代表十進(jìn)制數(shù)10。
下面舉例說(shuō)明字符在字符串中的位置信息。假設(shè)字符串為abc,則第一個(gè)字符a在 字符串中的位置信息可以設(shè)置為0,第二個(gè)字符b在字符串中的位置信息設(shè)置為1,第三個(gè) 字符c在字符串中的位置信息設(shè)置為2。換句話(huà)說(shuō),在一個(gè)字符串中,后一字符的位置信息 等于前一字符的位置信息加1,第一個(gè)字符的位置信息一般設(shè)置為0。本實(shí)施例中,可以配置一個(gè)位置計(jì)數(shù)器,用于為每個(gè)接收到的字符串中的字符進(jìn) 行計(jì)數(shù),生成該字符在字符串中的位置信息。例如,位置計(jì)數(shù)器接收到字符串中的第一個(gè) 字符時(shí),位置計(jì)數(shù)器計(jì)算值為0 (0表示第一個(gè)字符在字符串中的位置信息);當(dāng)接收到字 符串中的第二個(gè)字符時(shí),位置計(jì)數(shù)器計(jì)算值為1 (1表示第二個(gè)字符在字符串中的位置信 息);……;依此類(lèi)推,直到接收完字符串所有的字符為止。102、根據(jù)上述的字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹配,其中,該狀態(tài)機(jī)中各狀態(tài) 的跳轉(zhuǎn)條件包括字符以及位置信息;其中,根據(jù)接收的字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹配具體可以為判斷接收的字符與跳轉(zhuǎn)條件中包括的字符是否相同,并且接收的位置信息與跳轉(zhuǎn) 條件中包括的位置信息是否相同,如果均相同,再判斷該跳轉(zhuǎn)條件指向的狀態(tài)是否為接收 態(tài),如果是接收態(tài),則確定匹配到規(guī)則;如果不是接收態(tài),則確定尚未匹配到規(guī)則。反之,如果接收的字符與跳轉(zhuǎn)條件中包括的字符不相同,或者接收的位置信息與 跳轉(zhuǎn)條件中包括的位置信息不相同,又或者接收的字符與跳轉(zhuǎn)條件中包括的字符不相同, 并且接收的位置信息與跳轉(zhuǎn)條件中包括的位置信息不相同,則將接收的字符及其位置信息 丟棄,繼續(xù)接收下一字符及其位置信息。其中,根據(jù)實(shí)際應(yīng)用載體不同,狀態(tài)機(jī)可以采用數(shù)據(jù)表項(xiàng)、鏈表、指令表項(xiàng)、狀態(tài)圖 等方式來(lái)表示,本實(shí)施例不作限定。103、根據(jù)匹配輸出匹配結(jié)果。其中,如果匹配到規(guī)則,可以輸出匹配到的規(guī)則的標(biāo)識(shí),如果匹配不到規(guī)則,可以
輸出匹配錯(cuò)誤提示。本實(shí)施例中,可以在上述步驟101之前生成狀態(tài)機(jī)。如圖2所示,生成狀態(tài)機(jī)具體 可以包括以下步驟201、將輸入規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則;其中,將輸入規(guī)則進(jìn)行語(yǔ)法解析,若該輸入規(guī)則是帶有起始位置的純字符串,則可 以將該輸入規(guī)則改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則“.{!!!^乂乂”,其中,“.{m}”表示起始位 置,“XXX”表示字符。例如,起始位置為\d60,字符串為“http”的輸入規(guī)則可以改寫(xiě)成狀態(tài) 機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則“.{60}http其中,將輸入規(guī)則進(jìn)行語(yǔ)法解析,若該輸入規(guī)則是以起始位置“.{m} ”開(kāi)始的,且包 含“ []”,“ 0 ”,“ I,,中至少一個(gè)語(yǔ)法的正則表達(dá)式,則將該輸入規(guī)則改寫(xiě)成與上述的至少一 個(gè)語(yǔ)法對(duì)應(yīng)的若干個(gè)狀態(tài)機(jī)規(guī)則;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以起始位置“.{m}”開(kāi)始,且包 含上述的輸入規(guī)則的部分字符。具體地,語(yǔ)法“[]”表示范圍的意思,即方括號(hào)所示字符集中的任意一個(gè)字符,例如 [a-z]表示a到ζ中的任意一個(gè);“()”表示小括號(hào)中的字符串作為一個(gè)整體,不可分割,例 如(abc)表示abc作為一個(gè)不可分割的整體;“|”表示“或”的意思,例如a|b代表是a或 b。
6
下面舉例說(shuō)明輸入規(guī)則為正則表達(dá)式時(shí),如何將輸入規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě) 成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則舉例一、將輸入規(guī)則進(jìn)行語(yǔ)法解析,若該輸入規(guī)則是以起始位置“.{m} ”開(kāi)始的,且 包含語(yǔ)法“ □”的正則表達(dá)式,則將該輸入規(guī)則改寫(xiě)成若干個(gè)狀態(tài)機(jī)規(guī)則;其中,若干個(gè)狀 態(tài)機(jī)規(guī)則的數(shù)量與語(yǔ)法“[]”范圍相對(duì)應(yīng);每一個(gè)狀態(tài)機(jī)規(guī)則以起始位置“.{m} ”開(kāi)始,并包 含上述輸入規(guī)則的部分字符。例如,輸入規(guī)則為正則表達(dá)式“.{10} [abc]”,則將該輸入規(guī)則改寫(xiě)成與語(yǔ)法 “ □”范圍相對(duì)應(yīng)的3個(gè)狀態(tài)機(jī)規(guī)則,分別是“.{10}a", {10}b”以及“.{10}c”。其中,每 一個(gè)狀態(tài)機(jī)規(guī)則分別包含上述輸入規(guī)則的部分字符。舉例二,將輸入規(guī)則進(jìn)行語(yǔ)法解析,若該輸入規(guī)則是以起始位置“.{m} ”開(kāi)始的,且 包含語(yǔ)法“ I,,的正則表達(dá)式,則將該輸入規(guī)則改寫(xiě)成若干個(gè)狀態(tài)機(jī)規(guī)則;其中,若干個(gè)狀態(tài) 機(jī)規(guī)則的數(shù)量等于輸入規(guī)則中出現(xiàn)的語(yǔ)法“ I,,的數(shù)量加ι ;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以起始 位置“.{m} ”開(kāi)始,并包含上述輸入規(guī)則的部分字符。例如,輸入規(guī)則為正則表達(dá)式“.{10}a|b|c”,則將該輸入規(guī)則改寫(xiě)成3個(gè)狀態(tài)機(jī) 規(guī)則,分別為“.{10}a”、“. {10}b”、“. {10}c”。其中,狀態(tài)機(jī)規(guī)則的數(shù)量為3,等于2個(gè)語(yǔ)法 “ I ”的數(shù)量加1,且每一個(gè)狀態(tài)機(jī)規(guī)則分別包含上述輸入規(guī)則的部分字符。例如,輸入規(guī)則為正則表達(dá)式“.{3} abc I. {6}mnX”,則將該輸入規(guī)則改寫(xiě)成2個(gè) 狀態(tài)機(jī)規(guī)則,分別為“.{10}abc”和“.{6}mnX”。其中,狀態(tài)機(jī)規(guī)則的數(shù)量為2,等于1個(gè)語(yǔ) 法“ I ”的數(shù)量加1,且每一個(gè)狀態(tài)機(jī)規(guī)則分別包含上述輸入規(guī)則的部分字符。舉例三,將輸入規(guī)則進(jìn)行語(yǔ)法解析,若該輸入規(guī)則是以起始位置“.{m} ”開(kāi)始的,且 包含語(yǔ)法“[]”,“ 0 ”的正則表達(dá)式,則將該輸入規(guī)則改寫(xiě)成與上述語(yǔ)法“[]”,“ 0對(duì)應(yīng)的若 干個(gè)狀態(tài)機(jī)規(guī)則;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以起始位置“.Im}”開(kāi)始,且包含上述的輸入規(guī) 則的部分字符。例如,輸入規(guī)則為正則表達(dá)式“.{10} [abc] (ef) ”,則將該輸入規(guī)則改寫(xiě)成與上 述語(yǔ)法“[]”,“()對(duì)應(yīng)的3個(gè)狀態(tài)機(jī)規(guī)則,分別為“· {10}aef”,“. {10}bef”,“. {10}cef", 其中,每一個(gè)狀態(tài)機(jī)規(guī)則分別包含上述輸入規(guī)則的部分字符。舉例四,將輸入規(guī)則進(jìn)行語(yǔ)法解析,若該輸入規(guī)則是以起始位置“.{m} ”開(kāi)始的,且 包含語(yǔ)法“ []”,“ 0 ”,“ I,,的正則表達(dá)式,則將該輸入規(guī)則改寫(xiě)成與上述語(yǔ)法“ []”,“ 0 ”, “I”對(duì)應(yīng)的若干個(gè)狀態(tài)機(jī)規(guī)則;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以起始位置“.Im}”開(kāi)始,且包含上 述的輸入規(guī)則的部分字符。例如,輸入規(guī)則為正則表達(dá)式“.{10} [abc] (ef)g|h”,則將該輸入規(guī)則改寫(xiě)成與 上述語(yǔ)法“ □”,“0”,“|”對(duì)應(yīng)的6個(gè)狀態(tài)機(jī)規(guī)則,分別為“.{10}aefg”、“. {10}befg”、 “.{10}Cefg”、“. {10}aefh”、“. {10}befh”、“. {10} cefh”,且每一個(gè)狀態(tài)機(jī)規(guī)則分別包含上 述輸入規(guī)則的部分字符。202、根據(jù)狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建;其中,根據(jù)狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建具體可以為根據(jù)狀態(tài)機(jī)規(guī)則中的每個(gè)字符以及每個(gè)字符在狀態(tài)機(jī)規(guī)則中的位置信息構(gòu)建狀 態(tài)機(jī);其中,狀態(tài)機(jī)中的起始狀態(tài)至第二狀態(tài)的跳轉(zhuǎn)條件包括狀態(tài)機(jī)規(guī)則中的首字符以及 首字符的位置信息;狀態(tài)機(jī)中的第二狀態(tài)至第三狀態(tài)的跳轉(zhuǎn)條件包括狀態(tài)機(jī)規(guī)則中的次字符以及次字符的位置信息;……;依此類(lèi)推,狀態(tài)機(jī)中的倒數(shù)第二個(gè)狀態(tài)至最后一個(gè)狀態(tài)的 跳轉(zhuǎn)條件包括狀態(tài)機(jī)規(guī)則中的最后一個(gè)字符以及最后一個(gè)字符的位置信息。下面舉例說(shuō)明如何根據(jù)狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建假設(shè),初始條件下存在以起始位置.{0}開(kāi)始的3個(gè)狀態(tài)機(jī)規(guī)則,分別是“.{0} unset", {2}setup” 以及‘‘.{8} test”。其中,狀態(tài)機(jī)規(guī)則“.{0} unset” 的標(biāo)識(shí)為 r<l>,狀 態(tài)機(jī)規(guī)則“.{2} setup"的標(biāo)識(shí)為r<2>,狀態(tài)機(jī)規(guī)則“.{8} test”的標(biāo)識(shí)為r<3>,則分別根據(jù) 這3個(gè)狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建具體可以為請(qǐng)參閱圖3,在狀態(tài)0(又稱(chēng)起始狀態(tài))下,接收狀態(tài)機(jī)規(guī)則“.{0}imSet”輸入的第 一個(gè)字符“U”及其位置信息“0”,并將字符“U”及其位置信息“0”作為狀態(tài)0到狀態(tài)1的 跳轉(zhuǎn)條件;如圖3所示,狀態(tài)0到狀態(tài)1的跳轉(zhuǎn)條件可以表示為{0,u};本實(shí)施例中,字符 “U”也可以用ASCII碼“0x75”表示;在狀態(tài)1下,接收狀態(tài)機(jī)規(guī)則“.{0}imSet”輸入的第二個(gè)字符“η”及其位置信息 “1”,并將字符“η”及其位置信息“1”作為狀態(tài)1到狀態(tài)2的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)1 到狀態(tài)2的跳轉(zhuǎn)條件可以表示為{1,η};本實(shí)施例中,字符“η”也可以用ASCII碼“0x6e” 表示;在狀態(tài)2下,接收狀態(tài)機(jī)規(guī)則“.{0}unset"輸入的第三個(gè)字符“S”及其位置信息 “2”,并將字符“S”及其位置信息“2”作為狀態(tài)2到狀態(tài)3的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)2 到狀態(tài)3的跳轉(zhuǎn)條件可以表示為{2,s};本實(shí)施例中,字符“S”也可以用ASCII碼“0x73” 表示;在狀態(tài)3下,接收狀態(tài)機(jī)規(guī)則“.{0} unset ”輸入的第四個(gè)字符“ e ”及其位置信息 “3”,并將字符“e”及其位置信息“3”作為狀態(tài)3到狀態(tài)4的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)3 到狀態(tài)4的跳轉(zhuǎn)條件可以表示為{3,e};本實(shí)施例中,字符“e”也可以用ASCII碼“0x65” 表示;在狀態(tài)4下,接收狀態(tài)機(jī)規(guī)則“.{0} unset”輸入的第五個(gè)字符“t”及其位置信息 “4”,并將字符“t”及其位置信息“4”作為狀態(tài)4到狀態(tài)5的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)4 到狀態(tài)5的跳轉(zhuǎn)條件可以表示為{4,t};本實(shí)施例中,字符“t”也可以用ASCII碼“0x74”表示。至此,根據(jù)狀態(tài)機(jī)規(guī)則“.{0}unset”構(gòu)建狀態(tài)機(jī)完畢。如圖3所示,狀態(tài)5中包含 標(biāo)識(shí)r<l>,用于表示狀態(tài)5為接收態(tài),即在狀態(tài)5下可以匹配到標(biāo)識(shí)為r<l>的規(guī)則“.{0} unset,,。請(qǐng)參閱圖3,在狀態(tài)0(又稱(chēng)起始狀態(tài))下,接收狀態(tài)機(jī)規(guī)則“.{2} setup”輸入的第 一個(gè)字符“S”及其位置信息“2”,并將字符“S”及其位置信息“2”作為狀態(tài)0到狀態(tài)6的 跳轉(zhuǎn)條件;如圖3所示,狀態(tài)0到狀態(tài)6的跳轉(zhuǎn)條件可以表示為{2,s};本實(shí)施例中,字符 “S”也可以用ASCII碼“0x73”表示;在狀態(tài)6下,接收狀態(tài)機(jī)規(guī)則“.{2} setup”輸入的第二個(gè)字符“e”及其位置信息 “3”,并將字符“e”及其位置信息“3”作為狀態(tài)6到狀態(tài)7的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)6 到狀態(tài)7的跳轉(zhuǎn)條件可以表示為{3,e};本實(shí)施例中,字符“e”也可以用ASCII碼“0x65” 表示;在狀態(tài)7下,接收狀態(tài)機(jī)規(guī)則“.{2} setup"輸入的第三個(gè)字符“t”及其位置信息“4”,并將字符“t”及其位置信息“4”作為狀態(tài)7到狀態(tài)8的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)7 到狀態(tài)8的跳轉(zhuǎn)條件可以表示為{4,t};本實(shí)施例中,字符“t”也可以用ASCII碼“0x74” 表不;在狀態(tài)8下,接收狀態(tài)機(jī)規(guī)則“.{2}Setup”輸入的第四個(gè)字符“U”及其位置信息 “5”,并將字符“U”及其位置信息“5”作為狀態(tài)8到狀態(tài)9的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)8 到狀態(tài)9的跳轉(zhuǎn)條件可以表示為{5,u};本實(shí)施例中,字符“U”也可以用ASCII碼“0x75” 表不;在狀態(tài)9下,接收狀態(tài)機(jī)規(guī)則“.{0} setup”輸入的第五個(gè)字符“ρ”及其位置信息 “6”,并將字符“P”及其位置信息“6”作為狀態(tài)9到狀態(tài)10的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)9 到狀態(tài)10的跳轉(zhuǎn)條件可以表示為{6,p};本實(shí)施例中,字符“P”也可以用ASCII碼“0x70”表不。至此,根據(jù)狀態(tài)機(jī)規(guī)則“.{2} setup”構(gòu)建狀態(tài)機(jī)完畢。如圖3所示,狀態(tài)10中包含 標(biāo)識(shí)r<2>,用于表示狀態(tài)10為接收態(tài),即在狀態(tài)10下可以匹配到標(biāo)識(shí)為r<2>的規(guī)則“.{2} setup,,。請(qǐng)參閱圖3,在狀態(tài)0(又稱(chēng)起始狀態(tài))下,接收狀態(tài)機(jī)規(guī)則“.{8} test”輸入的第 一個(gè)字符“ t,,及其位置信息“8 ”,并將字符“ t,,及其位置信息“8 ”作為狀態(tài)0到狀態(tài)11的 跳轉(zhuǎn)條件;如圖3所示,狀態(tài)0到狀態(tài)11的跳轉(zhuǎn)條件可以表示為{8,t};本實(shí)施例中,字符 “t”也可以用ASCII碼“0x74”表示;在狀態(tài)11下,接收狀態(tài)機(jī)規(guī)則“.{8} test”輸入的第二個(gè)字符“e”及其位置信息 “9”,并將字符“e”及其位置信息“9”作為狀態(tài)11到狀態(tài)12的跳轉(zhuǎn)條件;如圖3所示,狀 態(tài)11到狀態(tài)12的跳轉(zhuǎn)條件可以表示為{9,e};本實(shí)施例中,字符“e”也可以用ASCII碼 “0x65” 表示;在狀態(tài)12下,接收狀態(tài)機(jī)規(guī)則“.{8} test”輸入的第三個(gè)字符“S”及其位置信息 “10”,并將字符“S”及其位置信息“10”作為狀態(tài)12到狀態(tài)13的跳轉(zhuǎn)條件;如圖3所示,狀 態(tài)12到狀態(tài)13的跳轉(zhuǎn)條件可以表示為{10,s};本實(shí)施例中,字符“S”也可以用ASCII碼 “0x73” 表示;在狀態(tài)13下,接收狀態(tài)機(jī)規(guī)則“.{8} test”輸入的第四個(gè)字符“t”及其位置信息 “11”,并將字符“t”及其位置信息“11”作為狀態(tài)13到狀態(tài)14的跳轉(zhuǎn)條件;如圖3所示,狀 態(tài)13到狀態(tài)14的跳轉(zhuǎn)條件可以表示為{11,t};本實(shí)施例中,字符“t”也可以用ASCII碼 “0x74” 表示。至此,根據(jù)狀態(tài)機(jī)規(guī)則“.{8} test”構(gòu)建狀態(tài)機(jī)完畢。如圖3所示,狀態(tài)14中包含 標(biāo)識(shí)r<3>,用于表示狀態(tài)14為接收態(tài),即在狀態(tài)14下可以匹配到標(biāo)識(shí)為r<3>的規(guī)則“.{8} test,,。假設(shè)初始條件下還存在以起始位置.{0}開(kāi)始的狀態(tài)機(jī)規(guī)則“.{0}imSetUp”,則可 以在狀態(tài)5下,繼續(xù)接收狀態(tài)機(jī)規(guī)則“.{0}unsetup”輸入的第六個(gè)字符“U”及其位置信息 “5”,并將字符“U”及其位置信息“5”作為狀態(tài)5到狀態(tài)9的跳轉(zhuǎn)條件;如圖3所示,狀態(tài)5 到狀態(tài)9的跳轉(zhuǎn)條件可以表示為{5,u};本實(shí)施例中,字符“U”也可以用ASCII碼“0x75” 表示。即狀態(tài)機(jī)規(guī)則“.{0}unsetup”與狀態(tài)機(jī)規(guī)則“.{0} setup”在構(gòu)建狀態(tài)機(jī)時(shí),存在狀 態(tài)機(jī)的尾部合并(MergeTail),可以進(jìn)一步優(yōu)化狀態(tài)機(jī)。
9
203、將構(gòu)建的狀態(tài)機(jī)轉(zhuǎn)換成匹配引擎所需要的格式并存儲(chǔ)。實(shí)際應(yīng)用中,匹配引擎的實(shí)現(xiàn)方式是多種多樣的。例如匹配引擎可以使用軟件,現(xiàn) 場(chǎng)可編程門(mén)陣列(Field-Programmable Gate Array, FPGA),或?qū)S蒙虡I(yè)芯片等實(shí)現(xiàn)匹配。 不同的實(shí)現(xiàn)方式需要不同的狀態(tài)機(jī)格式。因此,根據(jù)匹配引擎的實(shí)現(xiàn)方式的不同,可生成以 下?tīng)顟B(tài)機(jī)格式并在存儲(chǔ)在存儲(chǔ)器(Memory)中(1)如果匹配引擎直接使用軟件來(lái)實(shí)現(xiàn)匹配,則Memory里可以直接以鏈表形式將 狀態(tài)機(jī)存儲(chǔ);(2)如果匹配引擎使用FPGA來(lái)實(shí)現(xiàn)匹配,則Memory可以根據(jù)FPGA匹配特點(diǎn),轉(zhuǎn)換 成特定格式存儲(chǔ);(3)如果匹配引擎使用商用芯片來(lái)實(shí)現(xiàn)匹配,則Memory可以以商業(yè)芯片認(rèn)識(shí)的指 令將狀態(tài)機(jī)存儲(chǔ)。以圖3所示的狀態(tài)機(jī)為例,當(dāng)需要對(duì)輸入的字符串unset進(jìn)行匹配時(shí),具體操作如 下第一個(gè)輸入字符為U,位置信息為0,匹配引擎從狀態(tài)0跳到狀態(tài)1 ;第二個(gè)輸入字符為n,位置信息為1,匹配引擎從狀態(tài)1跳到狀態(tài)2 ;第三個(gè)輸入字符為s,位置信息為2,匹配引擎從狀態(tài)2跳到狀態(tài)3 ;第四個(gè)輸入字符為e,位置信息為3,匹配引擎從狀態(tài)3跳到狀態(tài)4 ;第五個(gè)輸入字符為t,位置信息為4,匹配引擎從狀態(tài)4跳到狀態(tài)5。因?yàn)闋顟B(tài)5是接收態(tài),匹配引擎上報(bào)匹配到了規(guī)則“.{0}unset”。本實(shí)施例中,將字符以及位置信息作為狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件,進(jìn)而在接收 到字符以及該字符在字符串中的位置信息后,可以在狀態(tài)機(jī)中進(jìn)行匹配并輸出匹配結(jié)果。 例如對(duì)于規(guī)則“.{2} abc”,如果利用現(xiàn)有技術(shù)的匹配方法進(jìn)行匹配,當(dāng)輸入字符串包含4個(gè) 相同的規(guī)則“abc”,即輸入字符串為“abcabcabcabc”時(shí),則可以匹配到4次“abc”并輸出匹 配結(jié)果,而僅有第二次匹配到的“abc”符合規(guī)則“.{2} abc”的起始位置,真正成功匹配到規(guī) 則“.{2}abc”。利用本發(fā)明實(shí)例提供的方法,在第一個(gè)abc輸入的時(shí)候,因?yàn)槲恢眯畔⒉粚?duì), 狀態(tài)機(jī)不會(huì)啟動(dòng);第二個(gè)abc輸入的時(shí)候,位置信息正確,狀態(tài)機(jī)啟動(dòng)且匹配成功;第三、第 四個(gè)abc輸入的時(shí)候因?yàn)槲恢眯畔⒉粚?duì),狀態(tài)機(jī)不會(huì)啟動(dòng)。所以,本發(fā)明實(shí)施例可以根據(jù)接 收的字符以及位置信息在狀態(tài)機(jī)中進(jìn)行匹配,減少無(wú)效匹配結(jié)果的輸出,提高規(guī)則匹配的 效率。實(shí)施例二 請(qǐng)參閱圖4,圖4為本發(fā)明實(shí)施例中提供的一種狀態(tài)機(jī)生成方法的流程圖。在圖4 所示的狀態(tài)機(jī)生成方法中,采用狀態(tài)機(jī)編譯器來(lái)生成狀態(tài)機(jī)。如圖4所示,該狀態(tài)機(jī)生成方 法可以包括以下步驟401、狀態(tài)機(jī)編譯器獲取規(guī)則;本實(shí)施例中,規(guī)則可以預(yù)先存儲(chǔ)在服務(wù)器或本地存儲(chǔ)器的規(guī)則庫(kù)中。狀態(tài)機(jī)編譯 器可以接收服務(wù)器或本地存儲(chǔ)器輸出的規(guī)則,例如,服務(wù)器或本地存儲(chǔ)器可以周期性地輸 入規(guī)則;或者,狀態(tài)機(jī)編譯器也可以通過(guò)其他方式主動(dòng)從服務(wù)器或本地存儲(chǔ)器中讀取規(guī)則。本實(shí)施例中,規(guī)則是具有起始位置的。例如,起始位置+純字符串的規(guī)則、正則表 達(dá)式“.{10}a|b|C”、“. {3}abc |. {6}mnX” 等等。
402、狀態(tài)機(jī)編譯器將獲取的規(guī)則進(jìn)行語(yǔ)法解析,如果語(yǔ)法正確,則執(zhí)行步驟403; 如果語(yǔ)法錯(cuò)誤,則上報(bào)錯(cuò)誤提示;其中,狀態(tài)機(jī)編譯器可以通過(guò)其解析模塊來(lái)實(shí)現(xiàn)輸入規(guī)則的語(yǔ)法解析。如果解析 模塊解析發(fā)現(xiàn)輸入規(guī)則的語(yǔ)法與系統(tǒng)采用的正則語(yǔ)法(如PCRE語(yǔ)法)不符,則說(shuō)明輸入規(guī) 則的語(yǔ)法錯(cuò)誤;反之,如果相符,則說(shuō)明輸入規(guī)則的語(yǔ)法正確。403、狀態(tài)機(jī)編譯器將獲取的規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài) 機(jī)規(guī)則;其中,狀態(tài)機(jī)編譯器獲取的規(guī)則可能是帶有起始位置的純字符串,也可能是以起 始位置“.{m},,開(kāi)始的,且包含“ []”,“ 0 ”,“ I,,這些語(yǔ)法的正則表達(dá)式。具體地,若狀態(tài)機(jī)編譯器獲取的規(guī)則是帶有起始位置的純字符串,則可以將該輸 入規(guī)則改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則“.{!!!^乂乂”,其中,“.{m} ”表示起始位置,“XXX” 表示字符。例如,起始位置為\d60,字符串為“http”的輸入規(guī)則可以改寫(xiě)成狀態(tài)機(jī)構(gòu)建所 需的狀態(tài)機(jī)規(guī)則".{60}http,,。具體地,若狀態(tài)機(jī)編譯器獲取的規(guī)則是以起始位置“.{m}”開(kāi)始的,且包含“[]”, “ 0 ”,“ ι ”這些語(yǔ)法的正則表達(dá)式,則將該正則表達(dá)式改寫(xiě)成與這些語(yǔ)法對(duì)應(yīng)的若干個(gè)狀態(tài) 機(jī)規(guī)則;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以起始位置“.Im}”開(kāi)始,且包含上述的正則表達(dá)式的部 分字符。上述的實(shí)施例一中,已經(jīng)詳細(xì)舉例說(shuō)明如何將以起始位置“.Im}”開(kāi)始的,且包含 “ []”,“ 0 ”,“ I,,這些語(yǔ)法的正則表達(dá)式改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則,本實(shí)施例不 作復(fù)述。其中,狀態(tài)機(jī)編譯器將獲取的規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀 態(tài)機(jī)規(guī)則具體可以采用如下方法實(shí)現(xiàn)1)狀態(tài)機(jī)編譯器將獲取的規(guī)則進(jìn)行語(yǔ)法解析后,對(duì)于語(yǔ)法錯(cuò)誤的規(guī)則可以從處理 隊(duì)列中直接刪除,而對(duì)于語(yǔ)法正確的規(guī)則可以存放于規(guī)則集中,生成規(guī)則集R ;2)在步驟1)生成的規(guī)則集R的基礎(chǔ)上,再進(jìn)一步將規(guī)則集R中的以起始位置 “.Im} ”開(kāi)始的,包含“ []”,“ 0 ”,“ I ”這些語(yǔ)法的正則表達(dá)式改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài) 機(jī)規(guī)則,這些狀態(tài)機(jī)規(guī)則與規(guī)則集R其余的規(guī)則(即帶有起始位置的純字符串)形成規(guī)則 集Rl ;其中,上述的步驟2)具體可以采用如下方法實(shí)現(xiàn)A)建一個(gè)空集合R2;B)對(duì)于步驟1)生成的規(guī)則集R,繼續(xù)對(duì)規(guī)則進(jìn)行語(yǔ)法分析;C)如果規(guī)則中包含有“ []”,“ 0 ”,“ I ”這些語(yǔ)法,則將該規(guī)則改寫(xiě)成狀態(tài)機(jī)構(gòu)建所 需的狀態(tài)機(jī)規(guī)則后添加到R2中,并將該規(guī)則從規(guī)則集R中刪除;D)否則,繼續(xù)遍歷規(guī)則集R ;E)是否已遍歷完規(guī)則集R,如果沒(méi)有遍歷完,則重復(fù)步驟B)至步驟D),否則繼續(xù)后 面步驟;F)將R2與刪除了正則表達(dá)式的R合并后生成R1。404、狀態(tài)機(jī)編譯器將狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建;其中,狀態(tài)機(jī)編譯器可以根據(jù)上述的步驟2)生成的規(guī)則集R1,構(gòu)建狀態(tài)機(jī);其中,規(guī)則集Rl中的規(guī)則是狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則,例如“.{60}http“.{0}abc” 以及 “.{0}\χ00\χ00\χ00” 等等。其中,狀態(tài)機(jī)編譯器將狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建具體可以采用如下方法實(shí)現(xiàn)(1)遍歷上述步驟2)生成的規(guī)則集Rl ;(2)對(duì)于每一條規(guī)則,從狀態(tài)0開(kāi)始根據(jù)規(guī)則的字符和位置信息建立分支;其中,規(guī)則的第一個(gè)字符的位置信息與規(guī)則的起始位置相同,后一個(gè)字符的位置 信息等于前一個(gè)字符的位置信息+1。(3)如果當(dāng)前狀態(tài)已經(jīng)存在包括上述字符和位置信息的跳轉(zhuǎn)條件,則沿著已有分 支前進(jìn),位置信息+1,字符前移;(4)如果當(dāng)前狀態(tài)沒(méi)有存在包括上述字符和位置信息的跳轉(zhuǎn)條件,則建立新的分 支,位置信息+1,字符前移;(5)如果當(dāng)前規(guī)則已經(jīng)完成,跳至步驟(6),否則重復(fù)步驟3),4);(6)如果規(guī)則集Rl已經(jīng)完成,跳至步驟(7),否則重復(fù)步驟3),4),5);(7)根據(jù)前面構(gòu)建的狀態(tài)機(jī),計(jì)算失效跳轉(zhuǎn);其中,所謂的失效跳轉(zhuǎn)是指狀態(tài)機(jī)中從某一規(guī)則的一個(gè)狀態(tài)跳轉(zhuǎn)至下一狀態(tài)時(shí), 該下一狀態(tài)與其他規(guī)則的某一個(gè)狀態(tài)重疊,該跳轉(zhuǎn)稱(chēng)為失效跳轉(zhuǎn)。如圖3所示,狀態(tài)5和狀 態(tài)9之間的跳轉(zhuǎn)即為失效跳轉(zhuǎn)。(8)遍歷已構(gòu)建的狀態(tài)機(jī)的狀態(tài),如果當(dāng)前狀態(tài)S除了已有的跳轉(zhuǎn)條件,遍歷還可 以跳轉(zhuǎn)到其他狀態(tài)Si,增加狀態(tài)S到狀態(tài)Sl的跳轉(zhuǎn)條件;(9)如果已經(jīng)遍歷完?duì)顟B(tài)機(jī)的所有狀態(tài),則退出,否則重復(fù)步驟⑶。其中,狀態(tài)機(jī)編譯器將狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建之后,可以對(duì)狀態(tài)機(jī)進(jìn)行如下 的狀態(tài)綜合處理a)根據(jù)已構(gòu)建的狀態(tài)機(jī),對(duì)于規(guī)則集Rl中的兩個(gè)規(guī)則rl和r2,且rl和r2具有 相同的規(guī)則號(hào);Bl代表rl在狀態(tài)機(jī)上的一個(gè)狀態(tài);B2代表r2在狀態(tài)機(jī)上的一個(gè)狀態(tài);b)如果B1、B2在狀態(tài)機(jī)上的深度(即距離起始狀態(tài)0的距離)相同,則設(shè)置此深 度為合并(Merge)的最大值;c)如果Bl和B2都沒(méi)有失效跳轉(zhuǎn)邊,則合并(Merge)的最小值為0 ;其中,Bl和B2都沒(méi)有失效跳轉(zhuǎn)邊,說(shuō)明Bl和B2之間沒(méi)有跳轉(zhuǎn)條件。d)否則,合并(Merge)的最小值為其中一個(gè)狀態(tài)出現(xiàn)失效跳轉(zhuǎn)的深度;如圖3所示,狀態(tài)5和狀態(tài)9之間存在失效跳轉(zhuǎn),則合并(Merge)的最小值為4(即 狀態(tài)9距離起始狀態(tài)0的距離為4個(gè)狀態(tài))。e)對(duì)于最大值、最小值之間的狀態(tài),進(jìn)行合并。本實(shí)施例中,對(duì)狀態(tài)機(jī)進(jìn)行狀態(tài)綜合處理是為了合并整個(gè)狀態(tài)機(jī)中的相同狀態(tài), 減小狀態(tài)機(jī),降低存儲(chǔ)空間。如圖3所示,合并(Merge)的最小值為4(即狀態(tài)9距離起始 狀態(tài)0的距離為4個(gè)狀態(tài)),而合并(Merge)的最大值為5 (即狀態(tài)10距離起始狀態(tài)0的距 離為5個(gè)狀態(tài)),可以將狀態(tài)9和狀態(tài)10合并,減小狀態(tài)機(jī),降低存儲(chǔ)空間。405、將構(gòu)建的狀態(tài)機(jī)轉(zhuǎn)換成匹配引擎所需要的格式并存儲(chǔ)。請(qǐng)參閱圖5,圖5為本發(fā)明實(shí)施例中提供的一種規(guī)則匹配方法的流程圖。在圖5所示的規(guī)則匹配方法中,采用狀態(tài)機(jī)匹配引擎來(lái)進(jìn)行規(guī)則的匹配。如圖5所示,該規(guī)則匹配方 法可以包括以下步驟501、狀態(tài)機(jī)匹配引擎接收字符串中的字符以及該字符在字符串中的位置信息;其中,狀態(tài)機(jī)匹配弓ι擎基于已構(gòu)建的狀態(tài)機(jī)工作。本實(shí)施例中,狀態(tài)機(jī)匹配引擎的輸入模塊中可以設(shè)置一個(gè)專(zhuān)門(mén)的位置計(jì)數(shù)器,用 于確定當(dāng)前輸入字符在字符串中的位置信息。其中,位置信息可以是正向或者反向的,反向 值等于字符串總長(zhǎng)度減去正向值。例如,狀態(tài)機(jī)匹配引擎接收到字符串第一個(gè)字符時(shí),位置 計(jì)數(shù)器計(jì)算值為0 ;接收到字符串第二個(gè)字符時(shí),位置計(jì)數(shù)器計(jì)算值為1 ;……;依此類(lèi)推, 直到接收完字符串所有的字符為止。當(dāng)每一個(gè)字符串的所有字符都輸入完畢,位置計(jì)數(shù)器 可以清零。進(jìn)一步地,如果位置信息已經(jīng)大于狀態(tài)機(jī)要求的最大位置信息時(shí),可以終止字符 輸入,不再做匹配。502、狀態(tài)機(jī)匹配引擎根據(jù)接收的字符以及該字符在字符串中的位置信息在狀態(tài) 機(jī)中進(jìn)行匹配;本實(shí)施例中,狀態(tài)機(jī)匹配引擎的匹配模塊可以根據(jù)接收的字符以及該字符在字符 串中的位置信息在狀態(tài)機(jī)中進(jìn)行匹配。假設(shè),狀態(tài)機(jī)規(guī)則“.{0}\χ00\χ00\χ00^Ρ". {5} abc”構(gòu)建的狀態(tài)機(jī)如圖6所示;其 中,狀態(tài)機(jī)規(guī)則“.{0}\X00\X00\X00”的標(biāo)識(shí)為r<l>,狀態(tài)機(jī)規(guī)則“.{5}abc”的標(biāo)識(shí)為r<2>。當(dāng)輸入字符串“\x00\x00\x00\x01\x02abceg” 時(shí),第一個(gè)輸入字符為\x00,位置信息為0,匹配引擎從狀態(tài)0跳到狀態(tài)1 ;第二個(gè)輸入字符為\x00,位置信息為1,匹配引擎從狀態(tài)1跳到狀態(tài)2 ;第三個(gè)輸入字符為\x00,位置信息為2,匹配引擎從狀態(tài)2跳到狀態(tài)3。因?yàn)闋?態(tài)3是接收態(tài),即匹配引擎上報(bào)匹配到了規(guī)則r<l> ;第四個(gè)輸入字符為\x01,位置信息為3,狀態(tài)3沒(méi)有這樣的跳轉(zhuǎn),匹配引擎回到狀 態(tài)0 ;第五個(gè)輸入字符為\x02,位置信息為4,狀態(tài)0沒(méi)有這樣的跳轉(zhuǎn);引擎繼續(xù)在狀 態(tài)0 ;第六個(gè)輸入字符為a,位置信息為5,匹配引擎從狀態(tài)0跳到狀態(tài)4 ;第七個(gè)輸入字符為b,位置信息為6,匹配引擎從狀態(tài)4跳到狀態(tài)5 ;第八個(gè)輸入字符為c,位置信息為7,匹配引擎從狀態(tài)5跳到狀態(tài)6。因?yàn)闋顟B(tài)6是接收態(tài),即匹配引擎匹配到了規(guī)則r<2> ;第九個(gè)輸入字符為e,位置信息為8,狀態(tài)6沒(méi)有這樣的跳轉(zhuǎn);引擎回到在狀態(tài)0 ;第十個(gè)輸入字符為g,位置信息為9,狀態(tài)0沒(méi)有這樣的跳轉(zhuǎn);引擎繼續(xù)在狀態(tài)0。本實(shí)施例中,狀態(tài)機(jī)匹配引擎中設(shè)置預(yù)先設(shè)置最大位置信息,這樣當(dāng)狀態(tài)機(jī)中的 位置信息已經(jīng)超過(guò)最大位置信息時(shí),可以停止匹配。例如,狀態(tài)機(jī)匹配引擎中可以設(shè)置預(yù)先設(shè)置最大位置信息為7,當(dāng)狀態(tài)機(jī)匹配引擎 在狀態(tài)6匹配到規(guī)則r<2>之后,可以停止匹配,因?yàn)楹罄m(xù)接收的第九個(gè)輸入的字符為e的 位置信息超過(guò)了預(yù)先設(shè)置的最大位置信息為7。假設(shè)狀態(tài)機(jī)如圖6所示,當(dāng)輸入字符串“abC\X01\X02\X00\X00\X03abC”時(shí),狀態(tài)機(jī)從狀態(tài)0開(kāi)始,一直沒(méi)有對(duì)應(yīng)的跳轉(zhuǎn),當(dāng)輸入字符的位置信息大于預(yù)先設(shè)置的最大位置 信息時(shí)(例如最大位置信息為7),狀態(tài)機(jī)匹配引擎可以停止匹配。這樣,通過(guò)“位置信息 +字符”的控制,就可以去掉多余的無(wú)效匹配。例如,輸入字符串“abc\X01\X02\X00\X00\ x03abc”中有兩個(gè)“abc”,僅僅從字符條件出發(fā),都是可以滿(mǎn)足規(guī)則r<2>的,但因?yàn)槲恢眯畔?的不匹配,可以直接在匹配階段去掉。另外,由于有些規(guī)則匹配時(shí)只關(guān)注其出現(xiàn)在某一位置時(shí)的匹配,對(duì)后續(xù)出現(xiàn)在其 他位置的匹配并不關(guān)注;這樣,有了位置信息后,就可以根據(jù)位置信息定位第一次出現(xiàn)的位 置,后續(xù)的就可以不用匹配了 ;如原先假設(shè)沒(méi)有位置信息,有一個(gè)規(guī)則是“abc”,現(xiàn)在有了 位置信息后,規(guī)則變?yōu)椤?010a,020b,030c”;如果現(xiàn)在有字符串“abcabcabc”,那么,如果按照 原來(lái)的規(guī)則“abc”,這個(gè)字符串中的“abcabcabc”需要被匹配三次;假設(shè)只關(guān)注第一個(gè)abc, 那么用了規(guī)則“010a,020b,030c”后,“abcabcabc”中的第一個(gè)“abc”會(huì)被匹配到,而第二 個(gè)、第三個(gè)“abc”就可以不用匹配了,這樣就節(jié)省了匹配時(shí)間。503、狀態(tài)機(jī)匹配引擎根據(jù)狀態(tài)機(jī)中的匹配信息對(duì)結(jié)果進(jìn)行處理。其中,如果匹配到規(guī)則,可以輸出匹配到的規(guī)則的標(biāo)識(shí),如果匹配不到規(guī)則,可以 輸出匹配錯(cuò)誤提示。本實(shí)施例中,如果生成的狀態(tài)機(jī)沒(méi)有計(jì)算失效跳轉(zhuǎn),則該狀態(tài)機(jī)可以稱(chēng)為確定的 有窮自動(dòng)機(jī)(Deterministic finite automaton, DFA);如果生成的狀態(tài)機(jī)計(jì)算失效跳轉(zhuǎn), 則該狀態(tài)機(jī)可以稱(chēng)為不確定有窮自動(dòng)機(jī)(Non-deterministic finite automaton,NFA)。與 DFA相比,NFA可以減少狀態(tài)機(jī)的存儲(chǔ)量(包括狀態(tài)數(shù)和跳轉(zhuǎn)條件),有效抑制狀態(tài)爆炸。其 中,所謂的狀態(tài)爆炸是指隨著規(guī)則數(shù)量的增加,狀態(tài)機(jī)的存儲(chǔ)量呈乘數(shù)或級(jí)數(shù)增加。因此,本實(shí)施例中生成的狀態(tài)機(jī)可以通過(guò)計(jì)算失效跳轉(zhuǎn)生成NFA,從而減少狀態(tài)機(jī) 的存儲(chǔ)量,有效抑制狀態(tài)爆炸。下面舉例說(shuō)明,本實(shí)施例生成的NFA可以減少狀態(tài)機(jī)的存儲(chǔ) 量,有效抑制狀態(tài)爆炸。例如,對(duì)于規(guī)則.{3}abc,其對(duì)應(yīng)的NFA為狀態(tài)數(shù)+跳轉(zhuǎn)條件=14 ;DFA為狀態(tài)數(shù)+跳轉(zhuǎn)條件=20 ;如果增加一條規(guī)則.{2}facd后,變?yōu)椤?{3} abc· {2}facd其對(duì)應(yīng)的NFA為狀態(tài)數(shù)+跳轉(zhuǎn)條件=22 ;較前面單條規(guī)則的NFA,存儲(chǔ)增長(zhǎng)(22-14)/14 = 57% ;其對(duì)應(yīng)的DFA為狀態(tài)數(shù)+跳轉(zhuǎn)條件=46 ;較前面單條規(guī)則的DFA,存儲(chǔ)增長(zhǎng)(46-20)/20 = 130% ;由上述例子可以看出,當(dāng)規(guī)則數(shù)增加時(shí),本實(shí)施例生成的NFA的存儲(chǔ)基本是線(xiàn)性 增長(zhǎng),而DFA的存儲(chǔ)往往是乘數(shù)或級(jí)數(shù)增長(zhǎng)的。所以隨著規(guī)則數(shù)量的增加,本實(shí)施例生成的 NFA可以減少狀態(tài)機(jī)的存儲(chǔ)量,有效抑制狀態(tài)爆炸。本實(shí)施例中,將字符以及位置信息作為狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件,可以有效地 減少失效跳轉(zhuǎn)。例如,存在標(biāo)識(shí)為r<l>的規(guī)則“.{0}abc”和標(biāo)識(shí)為r<2>規(guī)則“.{10}bad”,其中, 規(guī)則“.{0}abc”和規(guī)則“.{10}bad”構(gòu)建的狀態(tài)機(jī)如圖7所示。其中,狀態(tài)0與狀態(tài)1之間的跳轉(zhuǎn)條件包括字符“a”和位置信息“0”,狀態(tài)1與狀態(tài)2之間的跳轉(zhuǎn)條件包括字符“b”和 位置信息“1”,狀態(tài)2與狀態(tài)3之間的跳轉(zhuǎn)條件包括字符“C”和位置信息“2” ;狀態(tài)0與狀 態(tài)4之間的跳轉(zhuǎn)條件包括字符“b”和位置信息“ 10”,狀態(tài)4與狀態(tài)5之間的跳轉(zhuǎn)條件包括 字符“a”和位置信息“11”,狀態(tài)5與狀態(tài)6之間的跳轉(zhuǎn)條件包括字符“d”和位置信息“12”。 其中,狀態(tài)3是接收態(tài),即匹配引擎匹配到了規(guī)則r<l> ;狀態(tài)6是接收態(tài),即匹配引擎匹配 到了規(guī)則r<2>。可見(jiàn),在沒(méi)有去掉位置信息之前,因?yàn)橛形恢眯畔⒌南拗疲瑑蓷l規(guī)則構(gòu)建的狀態(tài)機(jī) 中沒(méi)有失效跳轉(zhuǎn)。當(dāng)去掉位置信息后,上述兩個(gè)規(guī)則構(gòu)建的狀態(tài)機(jī)如圖8所示。其中,狀態(tài)0與狀態(tài) 1之間的跳轉(zhuǎn)條件包括字符“a”,狀態(tài)1與狀態(tài)2之間的跳轉(zhuǎn)條件包括字符“b”,狀態(tài)2與狀 態(tài)3之間的跳轉(zhuǎn)條件包括字符“C” ;而狀態(tài)0與狀態(tài)4之間的跳轉(zhuǎn)條件包括字符“b”,狀態(tài) 4與狀態(tài)5之間的跳轉(zhuǎn)條件包括字符“a”,狀態(tài)5與狀態(tài)6之間的跳轉(zhuǎn)條件包括字符“d” ; 其中,狀態(tài)3是接收態(tài),即匹配引擎匹配到了規(guī)則r<l> ;因?yàn)闋顟B(tài)6是接收態(tài),即匹配引擎 匹配到了規(guī)則r<2>。如圖8所示,去掉位置信息后,規(guī)則r<l>的字符“b”之后的狀態(tài)就要 多添加失效跳轉(zhuǎn)a,而規(guī)則r<2>的字符“a”之后的狀態(tài)就要多添加失效跳轉(zhuǎn)C。當(dāng)規(guī)則數(shù) 量較大時(shí),失效跳轉(zhuǎn)會(huì)成為存儲(chǔ)的主要部分,浪費(fèi)存儲(chǔ)空間。本實(shí)施例中,將字符以及位置信息作為狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件,進(jìn)而在接收 到字符以及該字符在字符串中的位置信息后,可以在狀態(tài)機(jī)中進(jìn)行匹配并輸出匹配結(jié)果。 與現(xiàn)有技術(shù)相比,本發(fā)明實(shí)施例可以減少無(wú)效匹配結(jié)果的輸出,提高規(guī)則匹配的效率。實(shí)施例三請(qǐng)參閱圖9,圖9為本發(fā)明實(shí)施例中提供的一種規(guī)則匹配裝置的結(jié)構(gòu)圖,用于實(shí)現(xiàn) 上述的規(guī)則匹配方法。如圖9所示,該規(guī)則匹配裝置可以包括接收單元901,用于接收字符串中的字符以及該字符在字符串中的位置信息;其中,字符串的輸入可以是字符格式的,例如“EXample”,這類(lèi)字符串可以表示 所有的可顯示的ASCII碼;另外,字符串的輸入也可以是用\xhh轉(zhuǎn)義的ASCII碼,例如 “\x01\x02\x0a”,這類(lèi)字符串主要是用于表示無(wú)法顯示的ASCII碼。其中,位置信息的輸入可以是任意的進(jìn)制。例如,例如\d(ddd)代表十進(jìn)制數(shù), \x(hhh)代表16進(jìn)制數(shù)。如果只有兩位,可以不用“0”。例如\dl0代表十進(jìn)制數(shù)10。下面舉例說(shuō)明字符在字符串中的位置信息。假設(shè)字符串為abc,則第一個(gè)字符a在 字符串中的位置信息可以設(shè)置為0,第二個(gè)字符b在字符串中的位置信息設(shè)置為1,第三個(gè) 字符c在字符串中的位置信息設(shè)置為2。換句話(huà)說(shuō),在一個(gè)字符串中,后一字符的位置信息 等于前一字符的位置信息加1,第一個(gè)字符的位置信息一般設(shè)置為0。匹配單元902,用于根據(jù)接收單元501接收的字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹 配,并根據(jù)匹配輸出匹配結(jié)果;其中,狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件包括字符以及位置信息。如圖5所示,該規(guī)則匹配裝置可以包括狀態(tài)機(jī)生成單元903,用于生成狀態(tài)機(jī)。其中,匹配單元902具體用于根據(jù)接收單元901接收的字符及位置信息在狀態(tài)機(jī) 生成單元903生成的狀態(tài)機(jī)中進(jìn)行匹配,并根據(jù)匹配輸出匹配結(jié)果;其中,狀態(tài)機(jī)中各狀態(tài) 的跳轉(zhuǎn)條件包括字符以及位置信息。
請(qǐng)一并參閱圖10,圖10為本實(shí)施例中提供的另一種規(guī)則匹配裝置的結(jié)構(gòu)示意圖。 如圖10所示,在該規(guī)則匹配裝置中,狀態(tài)機(jī)生成單元903可以包括解析子單元9031,用于將輸入規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀 態(tài)機(jī)規(guī)則;構(gòu)建子單元9032,用于根據(jù)上述的狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建;存儲(chǔ)子單元9033,用于將構(gòu)建的狀態(tài)機(jī)轉(zhuǎn)換成匹配引擎所需要的格式并存儲(chǔ)。其中,解析子單元9031具體用于將輸入規(guī)則進(jìn)行語(yǔ)法解析,若輸入規(guī)則是帶有起 始位置的純字符串,則將輸入規(guī)則改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則“.{m}XXX”,其中, “.{m},,表示起始位置,“XXX”表示字符。其中,解析子單元5031具體將輸入規(guī)則進(jìn)行語(yǔ)法解析,若輸入規(guī)則是以起始位置 “.{m} ”開(kāi)始的,且包含“ []”,“ 0 ”,“ I ”中至少一個(gè)語(yǔ)法的正則表達(dá)式,則將正則表達(dá)式改寫(xiě) 成與至少一個(gè)語(yǔ)法對(duì)應(yīng)的若干個(gè)狀態(tài)機(jī)規(guī)則;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以起始位置“.Im}” 開(kāi)始,且包含正則表達(dá)式的部分字符。其中,構(gòu)建子單元9033具體用于根據(jù)狀態(tài)機(jī)規(guī)則中的每個(gè)字符以及每個(gè)字符在 狀態(tài)機(jī)規(guī)則中的位置信息構(gòu)建狀態(tài)機(jī);其中,在構(gòu)建子單元9033構(gòu)建的狀態(tài)機(jī)中,起始狀態(tài)至第二狀態(tài)的跳轉(zhuǎn)條件包括 狀態(tài)機(jī)規(guī)則中的首字符以及首字符的位置信息;狀態(tài)機(jī)中的第二狀態(tài)至第三狀態(tài)的跳轉(zhuǎn)條 件包括狀態(tài)機(jī)規(guī)則中的次字符以及次字符的位置信息;……;依此類(lèi)推,狀態(tài)機(jī)中的倒數(shù)第 二個(gè)狀態(tài)至最后一個(gè)狀態(tài)的跳轉(zhuǎn)條件包括狀態(tài)機(jī)規(guī)則中的最后一個(gè)字符以及最后一個(gè)字 符的位置信息。如圖10所示,在該規(guī)則匹配裝置中,匹配單元902可以包括判斷子單元9021,用于判斷接收單元901接收的字符與存儲(chǔ)子單元9033存儲(chǔ)的 狀態(tài)機(jī)的跳轉(zhuǎn)條件中包括的字符是否相同,且接收單元901接收的位置信息與存儲(chǔ)子單元 9033存儲(chǔ)的狀態(tài)機(jī)的跳轉(zhuǎn)條件中包括的位置信息是否相同,如果均相同,判斷該跳轉(zhuǎn)條件 指向的狀態(tài)是否為接收態(tài),若是,則確定匹配到規(guī)則;若否,則確定匹配不到規(guī)則。本實(shí)施例中,狀態(tài)機(jī)生成單元903將字符以及位置信息作為狀態(tài)機(jī)中各狀態(tài)的跳 轉(zhuǎn)條件,進(jìn)而在匹配單元902接收到字符以及該字符在字符串中的位置信息后,可以在狀 態(tài)機(jī)中進(jìn)行匹配并輸出匹配結(jié)果。與現(xiàn)有技術(shù)相比,本發(fā)明實(shí)施例可以減少無(wú)效匹配結(jié)果 的輸出,提高規(guī)則匹配的效率。在具體實(shí)現(xiàn)過(guò)程中,上述各匹配單元可以使用各種硬件芯片并結(jié)合各種附屬電路 來(lái)實(shí)現(xiàn),如通過(guò)DSP、FPGA等處理芯片并結(jié)合一些附屬電路(電源電路、存儲(chǔ)電路、接口電路 等)實(shí)現(xiàn),具體實(shí)現(xiàn)的方法為本領(lǐng)域技術(shù)人員所公知的技術(shù),在此不再贅述。本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過(guò) 程序指令相關(guān)的硬件來(lái)完成,前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序 在執(zhí)行時(shí),執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括只讀存儲(chǔ)器(ROM)、 隨機(jī)存取器(RAM)、磁碟或者光盤(pán)等各種可以存儲(chǔ)程序代碼的介質(zhì)。以上對(duì)本發(fā)明實(shí)施例中所提供的一種規(guī)則匹配方法及裝置進(jìn)行了詳細(xì)介紹,本文 中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫 助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會(huì)有改變之處,綜上,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā) 明的限制。
權(quán)利要求
一種規(guī)則匹配方法,其特征在于,包括接收字符串中的字符以及所述字符在所述字符串中的位置信息;根據(jù)所述字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹配,所述狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件包括字符以及位置信息;根據(jù)匹配輸出匹配結(jié)果。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述接收字符串中的字符以及所述字符 在所述字符串中的位置信息之前,還包括生成所述狀態(tài)機(jī);所述生成所述狀態(tài)機(jī)包括 將輸入規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則;根據(jù)所述狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建;將構(gòu)建的狀態(tài)機(jī)轉(zhuǎn)換成匹配引擎所需要的格式并存儲(chǔ)。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述將輸入規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成 狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則包括將輸入規(guī)則進(jìn)行語(yǔ)法解析,若所述輸入規(guī)則是帶有起始位置的純字符串,則將所示輸 入規(guī)則改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則“.lm}XXX”,其中,所述“.{m}”表示起始位置, “XXX”表示字符。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述將輸入規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成 狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則包括將輸入規(guī)則進(jìn)行語(yǔ)法解析,若所述輸入規(guī)則是以起始位置“.Im}”開(kāi)始的,且包含 “ []”,“ 0 ”,“ I,,中至少一個(gè)語(yǔ)法的正則表達(dá)式,則將所述正則表達(dá)式改寫(xiě)成與所述至少一 個(gè)語(yǔ)法對(duì)應(yīng)的若干個(gè)狀態(tài)機(jī)規(guī)則;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以所述起始位置“.Im}”開(kāi)始, 且包含所述正則表達(dá)式的部分字符。
5.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述根據(jù)所述狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu) 建包括根據(jù)所述狀態(tài)機(jī)規(guī)則中的每個(gè)字符以及所述每個(gè)字符在所述狀態(tài)機(jī)規(guī)則中的位置信 息構(gòu)建狀態(tài)機(jī);其中,所述狀態(tài)機(jī)中的初始狀態(tài)至第二狀態(tài)的跳轉(zhuǎn)條件包括所述狀態(tài)機(jī)規(guī)則中的首字 符以及所述首字符的位置信息;所述狀態(tài)機(jī)中的第二狀態(tài)至第三狀態(tài)的跳轉(zhuǎn)條件包括所述 狀態(tài)機(jī)規(guī)則中的次字符以及所述次字符的位置信息;依此類(lèi)推,所述狀態(tài)機(jī)中的倒數(shù)第二 個(gè)狀態(tài)至最后一個(gè)狀態(tài)的跳轉(zhuǎn)條件包括所述狀態(tài)機(jī)規(guī)則中的最后一個(gè)字符以及所述最后 一個(gè)字符的位置信息。
6.根據(jù)權(quán)利要求1 5任一項(xiàng)所述的方法,其特征在于,所述根據(jù)所述字符及位置信息 在狀態(tài)機(jī)中進(jìn)行匹配包括判斷接收的字符與跳轉(zhuǎn)條件中包括的字符是否相同,且接收的位置信息與跳轉(zhuǎn)條件 中包括的位置信息是否相同,如果均相同,判斷所述跳轉(zhuǎn)條件指向的狀態(tài)是否為接收態(tài),若 是,則確定匹配到規(guī)則;若否,則確定匹配不到規(guī)則。
7.一種規(guī)則匹配裝置,其特征在于,包括接收單元,用于接收字符串中的字符以及所述字符在所述字符串中的位置信息;2匹配單元,用于根據(jù)所述字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹配,并根據(jù)匹配輸出匹配 結(jié)果;所述狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件包括字符以及位置信息。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,還包括狀態(tài)機(jī)生成單元,用于生成所述狀態(tài)機(jī);所述狀態(tài)機(jī)生成單元包括解析子單元,用于將輸入規(guī)則進(jìn)行語(yǔ)法解析,并改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則;構(gòu)建子單元,用于根據(jù)所述狀態(tài)機(jī)規(guī)則進(jìn)行狀態(tài)機(jī)構(gòu)建;存儲(chǔ)子單元,用于將構(gòu)建的狀態(tài)機(jī)轉(zhuǎn)換成匹配引擎所需要的格式并存儲(chǔ)。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述解析子單元具體用于將輸入規(guī)則進(jìn)行語(yǔ)法解析,若所述輸入規(guī)則是帶有起始位置 的純字符串,則將所示輸入規(guī)則改寫(xiě)成狀態(tài)機(jī)構(gòu)建所需的狀態(tài)機(jī)規(guī)則“.{m}XXX”,其中,所 述“.{m},,表示起始位置,“XXX”表示字符。
10.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述解析子單元具體用于將輸入規(guī)則進(jìn)行語(yǔ)法解析,若所述輸入規(guī)則是以起始位置 “.{m},,開(kāi)始的,且包含“ []”,“ 0 ”,“ I,,中至少一個(gè)語(yǔ)法的正則表達(dá)式,則將所述正則表達(dá) 式改寫(xiě)成與所述至少一個(gè)語(yǔ)法對(duì)應(yīng)的若干個(gè)狀態(tài)機(jī)規(guī)則;其中,每一個(gè)狀態(tài)機(jī)規(guī)則以所述 起始位置“.Im}”開(kāi)始,且包含所述正則表達(dá)式的部分字符。
11.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述構(gòu)建子單元具體用于根據(jù)所述狀態(tài)機(jī)規(guī)則中的每個(gè)字符以及所述每個(gè)字符在所 述狀態(tài)機(jī)規(guī)則中的位置信息構(gòu)建狀態(tài)機(jī);其中,所述狀態(tài)機(jī)中的起始狀態(tài)至第二狀態(tài)的跳 轉(zhuǎn)條件包括所述狀態(tài)機(jī)規(guī)則中的首字符以及所述首字符的位置信息;所述狀態(tài)機(jī)中的第二 狀態(tài)至第三狀態(tài)的跳轉(zhuǎn)條件包括所述狀態(tài)機(jī)規(guī)則中的次字符以及所述次字符的位置信息; 依此類(lèi)推,所述狀態(tài)機(jī)中的倒數(shù)第二個(gè)狀態(tài)至最后一個(gè)狀態(tài)的跳轉(zhuǎn)條件包括所述狀態(tài)機(jī)規(guī) 則中的最后一個(gè)字符以及所述最后一個(gè)字符的位置信息。
12.根據(jù)權(quán)利要求7 11任一項(xiàng)所述的裝置,其特征在于,所述匹配單元包括判斷子單元,用于判斷接收的字符與跳轉(zhuǎn)條件中包括的字符是否相同,且接收的位置 信息與跳轉(zhuǎn)條件中包括的位置信息是否相同,如果均相同,判斷所述跳轉(zhuǎn)條件指向的狀態(tài) 是否為接收態(tài),若是,則確定匹配到規(guī)則;若否,則確定匹配不到規(guī)則。
全文摘要
本發(fā)明實(shí)施例公開(kāi)了一種規(guī)則匹配方法及裝置,用于提高規(guī)則匹配的效率。該方法包括接收字符串中的字符以及該字符在上述字符串中的位置信息;根據(jù)上述字符及位置信息在狀態(tài)機(jī)中進(jìn)行匹配,其中,狀態(tài)機(jī)中各狀態(tài)的跳轉(zhuǎn)條件包括字符以及位置信息;根據(jù)匹配輸出匹配結(jié)果。本發(fā)明實(shí)施例可以減少無(wú)效匹配結(jié)果的輸出,提高規(guī)則匹配的效率。
文檔編號(hào)G06F17/30GK101901268SQ20101024461
公開(kāi)日2010年12月1日 申請(qǐng)日期2010年8月2日 優(yōu)先權(quán)日2010年8月2日
發(fā)明者吳富強(qiáng), 孫靈燕, 曾佳, 郭智 申請(qǐng)人:華為技術(shù)有限公司