用于遍歷為具有高級(jí)特征的正則表達(dá)式圖樣生成的非確定有限自動(dòng)機(jī)(nfa)的系統(tǒng)和方法
【專利說明】用于遍歷為具有高級(jí)特征的正則表達(dá)式圖樣生成的非確定 有限自動(dòng)機(jī)(NFA)的系統(tǒng)和方法 背景
[0001] 開放系統(tǒng)互連(OSI)參考模型定義了用于通過傳輸介質(zhì)進(jìn)行通信的7個(gè)網(wǎng)絡(luò)協(xié)議 層(L1-L7)。上層(L4-L7)表示端到端通信并且下層(L1-L3)表示本地通信。
[0002] 聯(lián)網(wǎng)應(yīng)用感知系統(tǒng)需要處理、過濾和切換L3到L7網(wǎng)絡(luò)協(xié)議層的范圍,例如,L7網(wǎng) 絡(luò)協(xié)議層諸如超文本傳輸協(xié)議(HTTP)和簡(jiǎn)單郵件傳輸協(xié)議(SMTP),以及L4網(wǎng)絡(luò)協(xié)議層諸 如傳輸控制協(xié)議(TCP)。除了處理網(wǎng)絡(luò)協(xié)議層以外,聯(lián)網(wǎng)應(yīng)用感知系統(tǒng)需要通過L4-L7網(wǎng)絡(luò) 協(xié)議層來同時(shí)通過基于訪問和內(nèi)容的安全性來保護(hù)這些協(xié)議,這些協(xié)議層包括防火墻、虛 擬專用網(wǎng)(VPN)、安全套接字層(SSL)、入侵檢測(cè)系統(tǒng)(IDS)、互聯(lián)網(wǎng)協(xié)議安全(IPSec)、線速 的防病毒(AV)和防垃圾郵件功能。線速是在其上傳輸和接收數(shù)據(jù)的網(wǎng)絡(luò)的物理介質(zhì)上的 數(shù)據(jù)傳送速率。
[0003] 網(wǎng)絡(luò)處理器可用于高吞吐量L2和L3網(wǎng)絡(luò)協(xié)議處理,S卩,執(zhí)行數(shù)據(jù)包處理從而以線 速轉(zhuǎn)發(fā)數(shù)據(jù)包。通常,通用處理器用于處理需要更多智能處理的L4-L7網(wǎng)絡(luò)協(xié)議。雖然通 用處理器可以執(zhí)行計(jì)算密集型任務(wù),但是沒有足夠用于處理數(shù)據(jù)使得其能夠被以線速轉(zhuǎn)發(fā) 的性能。
[0004] 內(nèi)容感知聯(lián)網(wǎng)需要以"線速"的對(duì)數(shù)據(jù)包的內(nèi)容的檢查??梢詫?duì)內(nèi)容進(jìn)行分析,以 確定是否存在安全漏洞或入侵。應(yīng)用大量正則表達(dá)式形式的圖樣和規(guī)則以確保所有的安全 漏洞或入侵被檢測(cè)到。正則表達(dá)式是用于描述值/字符/字母串中的圖樣的緊湊型方法。 由正則表達(dá)式所匹配的最簡(jiǎn)單圖樣是單個(gè)值/字符/字母或值/字符/字母串,例如,/c/ 或/cat/。正則表達(dá)式還包括具有特殊含義的運(yùn)算符和元字符。
[0005] 通過使用元字符,正則表達(dá)式可以用于更復(fù)雜的搜索,諸如"abc.*xyz"。即,在 "abc"和"xyz"之間的無限量字符的情況下,找到字符串"abc",之后是字符串"xyz"。另一 示例是正則表達(dá)式"abc. .abc.*xyz; ",S卩,找到字符串"abc",后面兩個(gè)字符,然后是字符 串"abc"并且在無限量字符后由字符串"xyz"跟隨。
[0006] 入侵檢測(cè)系統(tǒng)(IDS)應(yīng)用檢查所有流過網(wǎng)絡(luò)的單獨(dú)數(shù)據(jù)包的內(nèi)容,并且標(biāo)識(shí)可能 指示嘗試闖入或威脅系統(tǒng)的可疑圖樣。可疑圖樣的一個(gè)示例可以是數(shù)據(jù)包中的特定文本 串,該特定文本串在100個(gè)字符以后跟隨另一特定文本串。
[0007] 通常使用搜索算法(如用于處理正則表達(dá)式的確定有限自動(dòng)機(jī)(DFA)或非確定有 限自動(dòng)機(jī)(NFA))執(zhí)行內(nèi)容搜索。 概述
[0008] 在一個(gè)實(shí)施例中,有效載荷段(也被稱為有效載荷的段)為有效載荷的被檢查與 NFA圖形節(jié)點(diǎn)中所指示的元素匹配的部分。有效載荷段可以是值、字符、字母、字節(jié)或其他數(shù) 據(jù)大小。有效載荷段可以具有任何粒度(例如,大?。?。例如,有效載荷段可以是一個(gè)字節(jié)、 多個(gè)字節(jié)、小于一個(gè)字節(jié)、或甚至任何數(shù)量的位。引擎可以處理最小粒度(例如,一個(gè)字節(jié)、 或任何數(shù)據(jù)量),但其還可以處理大于最小的粒度。在一個(gè)實(shí)施例中,有效載荷段可以是有 效載荷字節(jié)。
[0009] 在一個(gè)實(shí)施例中,一種行走表示圖樣的非確定有限自動(dòng)機(jī)(NFA)圖形的方法可以 包括:從該NFA圖形的一個(gè)節(jié)點(diǎn)中提取一種節(jié)點(diǎn)類型、下一個(gè)節(jié)點(diǎn)地址、計(jì)數(shù)值、和一個(gè)元 素;以及通過使一個(gè)有效載荷與該元素進(jìn)行匹配至少零次來將該有效載荷的一段針對(duì)該元 素進(jìn)行匹配。該次數(shù)可以基于該節(jié)點(diǎn)類型。
[0010] 在一個(gè)實(shí)施例中,該節(jié)點(diǎn)類型可以是以下各項(xiàng)中的至少一項(xiàng):可變計(jì)數(shù)、固定計(jì) 數(shù)、固定計(jì)數(shù)和可變計(jì)數(shù)、字符、不區(qū)分大小寫的字符、字符類、字符串、不區(qū)分大小寫的字 符串、標(biāo)記的或分離的。
[0011] 在一個(gè)實(shí)施例中,該方法還可以包括將一個(gè)條目推送至一個(gè)運(yùn)行堆棧。該條目可 以指示該節(jié)點(diǎn)類型、圖形中的下一個(gè)節(jié)點(diǎn)的地址、一個(gè)復(fù)制位、一個(gè)逆向位、一個(gè)有效載荷 偏移位、匹配類型、或計(jì)數(shù)值。將該條目推送至該運(yùn)行堆??梢曰谠摴?jié)點(diǎn)類型。如果該節(jié) 點(diǎn)類型為可變計(jì)數(shù)、固定-可變計(jì)數(shù)、或分離的,則可以執(zhí)行將該條目推送至該運(yùn)行堆棧。 該方法還可以包括:彈出該運(yùn)行堆棧的一個(gè)頂條目,加載所彈出的頂條目所指示的一個(gè)圖 形節(jié)點(diǎn),以及將該有效載荷的該段與該元素進(jìn)行匹配。在所彈出的頂條目中所指示的一個(gè) 有效載荷偏移下,可以在所加載的圖形節(jié)點(diǎn)中指示該元素。在將該有效載荷的該段與該元 素進(jìn)行匹配的失配后執(zhí)行將該運(yùn)行堆棧的該頂條目彈出。
[0012] 在一個(gè)實(shí)施例中,該方法包括:彈出該運(yùn)行堆棧的該頂條目,提取所彈出的頂條目 所存儲(chǔ)的圖形節(jié)點(diǎn)信息,以及將該有效載荷的該段與該元素進(jìn)行匹配。在所彈出的頂條目 中所指示的一個(gè)有效載荷偏移下,可以在所提取的圖形節(jié)點(diǎn)中指示該元素。在將該有效載 荷的該段與該元素進(jìn)行匹配的失配后可以執(zhí)行將該運(yùn)行堆棧的該頂條目彈出。
[0013] 在一個(gè)實(shí)施例中,字符串節(jié)點(diǎn)類型可以表示多個(gè)值的圖樣。每個(gè)值可以是字節(jié)、字 母、或字符中的至少一項(xiàng)。將該有效載荷的該段針對(duì)與字符串節(jié)點(diǎn)類型相關(guān)聯(lián)的該元素進(jìn) 行匹配可以包括使該段內(nèi)的至少兩個(gè)值針對(duì)被存儲(chǔ)作為該節(jié)點(diǎn)中的該元素的字符串的對(duì) 應(yīng)值進(jìn)行匹配(例如,并行)。如果該段與該元素部分匹配,并且如果該有效載荷的長度比 被存儲(chǔ)作為該節(jié)點(diǎn)的該元素的字符串的長度更短,則該方法可以包括加載該有效載荷的同 一流的下一個(gè)有效載荷并繼續(xù)將該字符串中的剩余值與該下一個(gè)有效載荷中的值進(jìn)行匹 配。該方法可以進(jìn)一步包括將一個(gè)部分匹配推送至一個(gè)當(dāng)加載該下一個(gè)有效載荷后有待加 載的保存緩沖區(qū)。將該部分匹配推送至該保存緩沖區(qū)可以包括:將正在被處理的一個(gè)當(dāng)前 運(yùn)行堆棧條目存儲(chǔ)在該保存緩沖區(qū)內(nèi),當(dāng)加載該下一個(gè)有效載荷后,將該保存緩沖區(qū)中所 存儲(chǔ)的至少一個(gè)條目拷貝至該運(yùn)行堆棧。如果從該運(yùn)行堆棧條目中讀取該節(jié)點(diǎn),則該方法 可以進(jìn)一步包括減少該運(yùn)行堆棧中所存儲(chǔ)的段的數(shù)量,并且如果該運(yùn)行堆棧條目中所存儲(chǔ) 的段的數(shù)量大于零,則將該運(yùn)行堆棧條目推送至該運(yùn)行堆棧。如果該節(jié)點(diǎn)類型為可變計(jì)數(shù) 領(lǐng)屬節(jié)點(diǎn)則將該有效載荷的該段與該元素進(jìn)行匹配可以包括:提取該有效載荷的至少一段 并且將該至少一段與該元素進(jìn)行匹配,直到不存在匹配,并且如果該有效載荷用盡,則將堆 該棧條目推送至該保存緩沖區(qū)并設(shè)置一個(gè)終止行走值。
[0014] 在一個(gè)實(shí)施例中,將該有效載荷的該段針對(duì)具有可變計(jì)數(shù)節(jié)點(diǎn)類型的該元素進(jìn)行 匹配可以包括針對(duì)該元素進(jìn)行匹配該節(jié)點(diǎn)所指示的可變次數(shù)。該可變次數(shù)可以為至少零 次、最多有限次數(shù)、或最多無限次數(shù)。該節(jié)點(diǎn)類型可以進(jìn)一步指示該可變計(jì)數(shù)節(jié)點(diǎn)為一個(gè)貪 婪節(jié)點(diǎn)、懶惰節(jié)點(diǎn)、領(lǐng)屬節(jié)點(diǎn)、或全匹配節(jié)點(diǎn)。
[0015] 在一個(gè)實(shí)施例中,如果節(jié)點(diǎn)類型為可變計(jì)數(shù)懶惰節(jié)點(diǎn)則將該有效載荷的該段與該 元素進(jìn)行匹配可以包括返回在該有效載荷中找到的最短匹配。如果該節(jié)點(diǎn)類型為可變計(jì) 數(shù)懶惰節(jié)點(diǎn)則針對(duì)該元素對(duì)該有效載荷的該段進(jìn)行匹配可以包括:將該段與該元素進(jìn)行匹 配,并且如果該段匹配,則加載該圖形中的該下一個(gè)節(jié)點(diǎn)地址處的下一個(gè)節(jié)點(diǎn),并且如果該 段不匹配,則返回不匹配。針對(duì)該可變計(jì)數(shù)懶惰節(jié)點(diǎn)對(duì)該有效載荷的該段進(jìn)行匹配可以包 括:如果該段匹配,則將該堆棧條目推送至該運(yùn)行堆棧并且加載該圖形中的該下一個(gè)節(jié)點(diǎn) 地址處的下一個(gè)節(jié)點(diǎn)。該堆棧條目可以指示該可變計(jì)數(shù)懶惰節(jié)點(diǎn)和有效載荷偏移。如果該 節(jié)點(diǎn)類型為可變計(jì)數(shù)懶惰節(jié)點(diǎn)則將該有效載荷的該段與該元素進(jìn)行匹配包括:如果將該下 一個(gè)節(jié)點(diǎn)元素與該段進(jìn)行匹配為失配,則從該運(yùn)行堆棧的該堆棧條目中彈出該可變計(jì)數(shù)懶 惰節(jié)點(diǎn)的節(jié)點(diǎn)類型的該節(jié)點(diǎn),并將所彈出的節(jié)點(diǎn)中所存儲(chǔ)的該元素與該有效載荷段進(jìn)行匹 配。當(dāng)將該有效載荷的該段與所彈出的節(jié)點(diǎn)中所存儲(chǔ)的該元素進(jìn)行匹配后,該方法可以包 括:減少該可變計(jì)數(shù)懶惰節(jié)點(diǎn)的一個(gè)計(jì)數(shù)值,將一個(gè)經(jīng)更新的堆棧條目推送至該運(yùn)行堆棧, 以及加載在所彈出的條目中所存儲(chǔ)的該下一個(gè)節(jié)點(diǎn)地址處的下一個(gè)節(jié)點(diǎn)。如果該有效載荷 的該段繼續(xù)在該第一有效載荷的同一流的下一個(gè)有效載荷內(nèi),則該方法還包括將該運(yùn)行堆 棧條目推送至一個(gè)保存緩沖區(qū)以及當(dāng)加載該下一個(gè)有效載荷后,將之后的緩沖區(qū)條目加載 到該運(yùn)行堆棧內(nèi)。
[0016] 在一個(gè)實(shí)施例中,如果該節(jié)點(diǎn)類型為可變計(jì)數(shù)貪婪節(jié)點(diǎn)或可變計(jì)數(shù)領(lǐng)屬節(jié)點(diǎn)則將 該有效載荷的該段針對(duì)該元素進(jìn)行匹配包括返回在該有效載荷中找到的最長匹配。
[0017] 在一個(gè)實(shí)施例中,如果該節(jié)點(diǎn)類型為可變計(jì)數(shù)貪婪節(jié)點(diǎn)則將該有效載荷的該段與 該元素進(jìn)行匹配可以包括提取該有效載荷的至少一段。該方法可以進(jìn)一步包括將該至少一 段與該元素進(jìn)行匹配。如果存在不匹配并且對(duì)該元素進(jìn)行匹配小于等于可變計(jì)數(shù)貪婪節(jié)點(diǎn) 中的可變計(jì)數(shù)的次數(shù),或該有效載荷中不再有可用的段,則該方法可以包括:如果所匹配的 段的數(shù)量指示已經(jīng)對(duì)該元素進(jìn)行匹配小于最大次數(shù),則推送存儲(chǔ)該節(jié)點(diǎn)的該節(jié)點(diǎn)類型、該 有效載荷的至少一段的有效載荷偏移、和所匹配的該數(shù)量的段的運(yùn)行堆棧條目,提取該下 一個(gè)節(jié)點(diǎn)地址所指示的該NFA圖形的下一個(gè)節(jié)點(diǎn),以及繼續(xù)將該有效載荷偏移后面的一個(gè) 位置所指示的該有效載荷的下一段與該下一個(gè)節(jié)點(diǎn)的一個(gè)第二元素進(jìn)行匹配,其中,如果 存在不匹配,則從該運(yùn)行堆棧彈出該運(yùn)行堆棧條目,使段匹配計(jì)數(shù)的數(shù)量減量,將該經(jīng)更新 的運(yùn)行堆棧條目推送回該運(yùn)行堆棧,并且繼續(xù)將來自所彈出的條目中所存儲(chǔ)的偏移的該有 效載荷的該下一段與所彈出的條目中所存儲(chǔ)的該下一個(gè)節(jié)點(diǎn)地址處存儲(chǔ)的下一個(gè)節(jié)點(diǎn)的 該元素進(jìn)行匹配。
[0018] 該方法可以進(jìn)一步包括:如果確定匹配,則將一個(gè)條目推送至一個(gè)指示該段的有 效載荷偏移的運(yùn)行堆棧,如果到達(dá)該可變計(jì)數(shù)貪婪節(jié)點(diǎn)的計(jì)數(shù),則加載下一個(gè)節(jié)點(diǎn)。該方法 可以進(jìn)一步包括:如果沒有達(dá)到該可變計(jì)數(shù)貪婪節(jié)點(diǎn)的該計(jì)數(shù),則確定該有效載荷的后續(xù) 段與該元素匹配。該方法可以進(jìn)一步包括:如果確定不匹配,則從一個(gè)運(yùn)行堆棧彈出一個(gè)條 目并確定在所彈出的條目的節(jié)點(diǎn)中指示的該有效載荷偏移處的該有效載荷的該段與所彈 出的條目的節(jié)點(diǎn)中指示的該元素匹配。
[0019] 在一個(gè)實(shí)施例中,該方法可以進(jìn)一步包括:如果該節(jié)點(diǎn)類型為可變計(jì)數(shù)貪婪節(jié)點(diǎn), 則對(duì)該有效載荷的該段針對(duì)該元素進(jìn)行以下匹配:提取該有效載荷的至少一段并將該至少 一段與該元素進(jìn)行匹配直到存在不匹配,其中,該至少一段與該元素匹配等于該可變計(jì)數(shù) 貪婪節(jié)點(diǎn)中的可變計(jì)數(shù)的次數(shù),或該有效載荷中不再有可用的段,并且然后,如果一個(gè)運(yùn)行 堆棧條目的計(jì)數(shù)大于零,則推送該堆棧條目。該方法可以進(jìn)一步包括:如果從該堆棧條目讀 取該節(jié)點(diǎn),則減少該堆棧條目的該可變計(jì)數(shù),并且如果該可變計(jì)數(shù)大于零,則推送一個(gè)運(yùn)行 堆棧條目。
[0020] 在一個(gè)實(shí)施例中,該方法可以進(jìn)一步包括:如果該節(jié)點(diǎn)類型為可變計(jì)數(shù)領(lǐng)屬節(jié)點(diǎn), 則將該有效載荷的該段與該元素進(jìn)行以下匹配:連續(xù)地將該有效載荷段與該元素進(jìn)行匹配 直到不匹配或該可變計(jì)數(shù)領(lǐng)屬節(jié)點(diǎn)的計(jì)數(shù)指示已經(jīng)對(duì)該元素進(jìn)行匹配最大次數(shù),并且然后 繼續(xù)將該有效載荷的后續(xù)段與該下一個(gè)節(jié)點(diǎn)地址處所存儲(chǔ)的該下一個(gè)節(jié)點(diǎn)進(jìn)行匹配。如果 包括該有效載荷段的有效載荷用盡,則該方法包括將該節(jié)點(diǎn)、計(jì)數(shù)、和有效載荷偏移推送至 一個(gè)保存緩沖區(qū),并且當(dāng)從該有效載荷段的同一流中加載下一個(gè)有效載荷段后,從該保存 緩沖區(qū)加載該節(jié)點(diǎn)、計(jì)數(shù)、和有效載荷偏移并且繼續(xù)將該下一個(gè)有效載荷段的該段與該元 素進(jìn)行匹配。
[0021] 在一個(gè)實(shí)施例中,如果該節(jié)點(diǎn)類型為可變計(jì)數(shù)全匹配節(jié)點(diǎn)則將該有效載荷的該段 與該元素進(jìn)行匹配可以包括返回在該有效載荷中找到的所有匹配。如果該節(jié)點(diǎn)類型為可變 計(jì)數(shù)全匹配節(jié)點(diǎn)則針對(duì)該元素對(duì)該有效載荷的該段進(jìn)行匹配可以進(jìn)一步包括:將該段與該 元素進(jìn)行匹配,并且如果其匹配,則將該節(jié)點(diǎn)推送至該運(yùn)行堆棧,并且如果其不匹配,則返 回不匹配。該堆棧條目可以用繼續(xù)對(duì)該NFA圖形進(jìn)行匹配的指示來指示該可變計(jì)數(shù)全匹配 節(jié)點(diǎn)和有效載荷偏移。推送該運(yùn)行堆棧條目可以包括將復(fù)制值設(shè)置成假。如果該有效載荷 的該段不可用,則對(duì)該有效載荷的該段進(jìn)行匹配可以包括將該節(jié)點(diǎn)推送至該保存緩沖區(qū)并 將一個(gè)終止行走值設(shè)置成真。
[0022] 在一個(gè)實(shí)施例中,如果該節(jié)點(diǎn)類型為可變計(jì)數(shù)全匹配節(jié)點(diǎn)則將該有效載荷的該段 針對(duì)該元素進(jìn)行匹配可以包括將該段與該元素進(jìn)行匹配,并且如果字節(jié)匹配,則存儲(chǔ)該匹 配,并且指示如果找到匹配則繼續(xù)對(duì)該NFA圖形進(jìn)行匹配。
[0023] 在一個(gè)實(shí)施例中,如果該節(jié)點(diǎn)類型為可變計(jì)數(shù)全匹配節(jié)點(diǎn)則將該有效載荷的該段 與該元素進(jìn)行匹配包括:將該段與該元素進(jìn)行匹配,并且如果其匹配,則將該節(jié)點(diǎn)推送至該 運(yùn)行堆棧,并且如果其不匹配,則返回不匹配。推送該運(yùn)行堆棧條目包括將復(fù)制值設(shè)置成 假。如果該有效載荷的該段不可用,則該方法包括:對(duì)該有效載荷的該段進(jìn)行匹配包括將該 節(jié)點(diǎn)推送至該保存緩沖區(qū)并將一個(gè)終止行走值設(shè)置成真。
[0024] 在一個(gè)實(shí)施例中,一種固定計(jì)數(shù)節(jié)點(diǎn)類型表示有待針對(duì)一個(gè)元素進(jìn)行匹配固定次 數(shù)的圖樣。如果該有效載荷的長度比該固定計(jì)數(shù)節(jié)點(diǎn)的計(jì)數(shù)更短,則該方法可以包括加載 下一個(gè)有效載荷并繼續(xù)將該元素中的剩余值與該下一個(gè)有效載荷中的值進(jìn)行匹配。該方法 可以進(jìn)一步包括將一個(gè)部分匹配推送至一個(gè)當(dāng)加載該下一個(gè)有效載荷后有待加載的保存 緩沖區(qū)。將該部分匹配推送至該保存緩沖區(qū)可以包括:將來自一個(gè)運(yùn)行堆棧的至少一個(gè)條 目存儲(chǔ)在該保存緩沖區(qū)內(nèi),并且當(dāng)加載該下一個(gè)有效載荷后,將該保存緩沖區(qū)中所存儲(chǔ)的 至少一個(gè)條目拷貝至該運(yùn)行堆棧。該固定計(jì)數(shù)節(jié)點(diǎn)類型的該元素可以是字符、字符類或字 符串。將該有效載荷的該段與和該固定計(jì)數(shù)節(jié)點(diǎn)類型相關(guān)聯(lián)的該元素進(jìn)行匹配包括將該 段內(nèi)的至少兩個(gè)值針對(duì)該節(jié)點(diǎn)中所存儲(chǔ)的該元素的一個(gè)值進(jìn)行匹配。如果該段與該元素匹 配,并且如果該有效載荷的長度比該固定計(jì)數(shù)節(jié)點(diǎn)的計(jì)數(shù)更短,則該方法包括加載該有效 載荷的同一流的下一個(gè)有效載荷并繼續(xù)將該元素中的剩余值與該下一個(gè)有效載荷中的值 進(jìn)行匹配。
[0025] 在一個(gè)實(shí)施例中,元素可以是字符、字符類和字符串中的至少一項(xiàng)。字符類可以表 示至少一個(gè)值的布爾或運(yùn)算。每個(gè)字符類可以作為遮罩存儲(chǔ)在存儲(chǔ)器內(nèi),其中,如果遮罩 中的每個(gè)可能的字符為字符類的一部分,則設(shè)置一個(gè)與該字符相對(duì)應(yīng)的指示符,并且如果 其不是字符類的一部分,則不設(shè)置。該方法可以進(jìn)一步包括通過將該有效載荷的一段用作 該遮罩的索引來對(duì)該有效載荷的該段進(jìn)行匹配,從而使得如果設(shè)置所標(biāo)引的條目,則圖形 行走引擎確定該有效載荷段與該字符類匹配。每個(gè)字符類可以作為二維矩陣存儲(chǔ)在存儲(chǔ)器 中。與該字符類相關(guān)聯(lián)的第一索引和與該字符值相關(guān)聯(lián)的第二索引可以訪問該二維矩陣。 如果該節(jié)點(diǎn)類型為字符類則將該有效載荷的一段針對(duì)該元素進(jìn)行匹配可以包括:用是該節(jié) 點(diǎn)的該元素中所指示的字符類索引的第一索引和是該有效載荷的該段的第二索引訪問該 二維矩陣,并且如果設(shè)置了該條目則發(fā)布匹配并且如果未設(shè)置該條目則發(fā)布不匹配。
[0026] 在一個(gè)實(shí)施例中,該方法可以包括:當(dāng)成功匹配后,從自該節(jié)點(diǎn)提取的該下一個(gè)節(jié) 點(diǎn)地址加載該NFA圖形的一個(gè)第二節(jié)點(diǎn)。
[0027] 在一個(gè)實(shí)施例中,該計(jì)數(shù)值可以指示針對(duì)該元素匹配的最大次數(shù)。如果該節(jié)點(diǎn)類 型為固定計(jì)數(shù),則該計(jì)數(shù)值可以指示針對(duì)該元素匹配的恰好次數(shù)。如果該節(jié)點(diǎn)類型為字符 串,則該計(jì)數(shù)值可以指示字符串的長度。
[0028] 該方法還可以包括:如果該節(jié)點(diǎn)類型為可變計(jì)數(shù),則從該節(jié)點(diǎn)提取一個(gè)計(jì)數(shù)值, 其中該計(jì)數(shù)值指示與該元素進(jìn)行匹配的最大次數(shù),如果該節(jié)點(diǎn)類型為固定計(jì)數(shù),則從該節(jié) 點(diǎn)提取一個(gè)計(jì)數(shù)值,該計(jì)數(shù)值指示與元素進(jìn)行匹配的恰好次數(shù),如果該節(jié)點(diǎn)類型為字符串, 則從該節(jié)點(diǎn)提取一個(gè)計(jì)數(shù)值,該計(jì)數(shù)值指示該字符串的長度,并且如果該節(jié)點(diǎn)類型為固 定-可變計(jì)數(shù),則從該節(jié)點(diǎn)提取兩個(gè)計(jì)數(shù)值,一個(gè)第一計(jì)數(shù)值指示與該元素進(jìn)行匹配的恰 好次數(shù)而一個(gè)第二計(jì)數(shù)值指示與該元素進(jìn)行匹配的最大次數(shù)。
[0029] 在一個(gè)實(shí)施例中,該方法可以包括:該有效載荷的該段與標(biāo)記節(jié)點(diǎn)類型相關(guān)聯(lián)的 該元素進(jìn)行以下匹配:指示找到匹配,并且彈出一個(gè)運(yùn)行堆棧中的任何條目,或者,如果在 該節(jié)點(diǎn)中進(jìn)行了指示,貝1」繼續(xù)在逆向方向上行走該節(jié)點(diǎn)中所指示的該下一個(gè)地址處的下一 個(gè)節(jié)點(diǎn)。
[0030] 在一個(gè)實(shí)施例中,將該有效載荷的該段與和節(jié)點(diǎn)類型為固定-可變計(jì)數(shù)節(jié)點(diǎn)類型 相關(guān)聯(lián)的該元素進(jìn)行匹配可以包括對(duì)該元素進(jìn)行匹配從該節(jié)點(diǎn)提取的固定計(jì)數(shù)值所指示 的固定次數(shù)和從該節(jié)點(diǎn)提取的可變計(jì)數(shù)值所指示的可變次數(shù)。該可變次數(shù)可以為至少零 次、最多有限次數(shù)或最多無限次數(shù)。該固定次數(shù)可以是指示一次。該固定次數(shù)可以是零次, 從而使得該固定-可變計(jì)數(shù)節(jié)點(diǎn)類型的元素被匹配為可變計(jì)數(shù)節(jié)點(diǎn)。
[0031] 在一個(gè)實(shí)施例中,如果該節(jié)點(diǎn)類型為固定-可變計(jì)數(shù)懶惰節(jié)點(diǎn)則將該有效載荷的 該段與該元素進(jìn)行匹配可以包括:將該段與該元素進(jìn)行匹配,并且如果該段匹配,則加載該 圖形中的該下一個(gè)節(jié)點(diǎn)地址處的下一個(gè)節(jié)點(diǎn),并且如果該段不匹配,則返回不匹配。如果該 節(jié)點(diǎn)類型為可固定-變計(jì)數(shù)懶惰節(jié)點(diǎn)則將該有效載荷的該段與該元素進(jìn)行匹配可以包括 將一個(gè)堆棧條目推送至一個(gè)運(yùn)行堆棧,該堆棧條目指示該可變計(jì)數(shù)懶惰節(jié)點(diǎn)和