国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種正則表達式匹配方法及裝置制造方法

      文檔序號:6520511閱讀:228來源:國知局
      一種正則表達式匹配方法及裝置制造方法
      【專利摘要】本發(fā)明公開了一種正則表達式匹配方法及裝置,用以提高正則表達式的匹配速度。該方法包括:確定正則表達式的指紋;根據(jù)該正則表達式的指紋,確定該正則表達式的代表指紋;根據(jù)該正則表達式的代表指紋,確定正則表達式組,并確定該正則表達式組的代表指紋;基于該正則表達式組的代表指紋與該正則表達式組編譯成的確定有限狀態(tài)自動機DFA的對應(yīng)關(guān)系,對待匹配數(shù)據(jù)進行正則表達式匹配。
      【專利說明】一種正則表達式匹配方法及裝置【技術(shù)領(lǐng)域】
      [0001]本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及一種正則表達式匹配方法及裝置。
      【背景技術(shù)】
      [0002]正則表達式可以用簡單的語法描述復(fù)雜的數(shù)據(jù)特征,因此被廣泛應(yīng)用于網(wǎng)絡(luò)入侵檢測、文檔內(nèi)容檢索等多個領(lǐng)域。
      [0003]判斷待匹配數(shù)據(jù)中是否包含正則表達式所描述的數(shù)據(jù)特征,稱為正則表達式的匹配。目前的正則表達式匹配方案中通常會將包含相同的字符串的正則表達式分為一組,該相同的字符串稱為該正則表達式組的廣義字符串,然后將每個正則表達式組編譯成一個確定有限狀態(tài)自動機(Deterministic Finite Automaton,DFA),建立每個正則表達式組的廣義字符串與DFA的對應(yīng)關(guān)系,在進行匹配時,先將待匹配數(shù)據(jù)和各正則表達式組的廣義字符串進行匹配,確定出待匹配數(shù)據(jù)中包含正則表達式組的廣義字符串時,獲取與該包含的廣義字符串對應(yīng)的DFA,每個DFA由多個狀態(tài)以及狀態(tài)之間的轉(zhuǎn)移邊構(gòu)成,根據(jù)獲取的DFA通過狀態(tài)跳轉(zhuǎn)的方式實現(xiàn)正則表達式的匹配。
      [0004]然而,采用上述方案將會生成大量的DFA,不但會占用大量的存儲空間,還會導(dǎo)致匹配速度較慢。
      【發(fā)明內(nèi)容】

      [0005]本發(fā)明實施例提供一種正則表達式匹配方法及裝置,用以解決正則表達式匹配速度較慢的問題。
      [0006]第一方面,提供一種正則表達式匹配方法,包括:
      [0007]確定正則表達式的指紋;
      [0008]根據(jù)所述正則表達式的指紋,確定所述正則表達式的代表指紋;
      [0009]根據(jù)所述正則表達式的代表指紋,確定正則表達式組,并確定所述正則表達式組的代表指紋;
      [0010]基于所述正則表達式組的代表指紋與所述正則表達式組編譯成的確定有限狀態(tài)自動機DFA的對應(yīng)關(guān)系,對待匹配數(shù)據(jù)進行正則表達式匹配。
      [0011]結(jié)合第一方面,在第一方面的第一種實現(xiàn)方式中,所述確定正則表達式的指紋,具體包括:
      [0012]提取正則表達式的必經(jīng)字符串,并截取預(yù)設(shè)長度的所述必經(jīng)字符串作為所述正則表達式的指紋;所述必經(jīng)字符串為能夠匹配上所述正則表達式的數(shù)據(jù)中都包含的字符串。
      [0013]結(jié)合第一方面的第一種實現(xiàn)方式,在第一方面的第二種實現(xiàn)方式中,所述提取正則表達式的必經(jīng)字符串,具體包括:
      [0014]當(dāng)正則表達式中至少包含嵌套元字符時,若最外層嵌套元字符中不包含分支元字符,且最外層嵌套元字符后沒有重復(fù)元字符,則提取刪除所述正則表達式的最外層嵌套元字符后的正則表達式的必經(jīng)字符串,作為所述正則表達式的必經(jīng)字符串;[0015]當(dāng)正則表達式中至少包含嵌套元字符和分支元字符時,若任何嵌套元字符中均不包含分支元字符,或僅最外層嵌套元字符包含分支元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串中都包含的字符串;
      [0016]當(dāng)正則表達式中至少包含嵌套元字符、分支元字符和重復(fù)元字符時,若任何嵌套元字符中均不包含重復(fù)元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串。
      [0017]結(jié)合第一方面或者第一方面的第一種實現(xiàn)方式或者第一方面的第二種實現(xiàn)方式,在第一方面的第三種實現(xiàn)方式中,所述根據(jù)所述正則表達式的指紋,確定所述正則表達式的代表指紋,具體包括:
      [0018]將所述正則表達式的指紋進行哈希,選擇哈希沖突最小的指紋作為所述正則表達式的代表指紋。
      [0019]結(jié)合第一方面或者第一方面的第一種實現(xiàn)方式或者第一方面的第二種實現(xiàn)方式或者第一方面的第三種實現(xiàn)方式,在第一方面的第四種實現(xiàn)方式中,所述根據(jù)所述正則表達式的代表指紋,確定正則表達式組,具體包括:
      [0020]根據(jù)所述正則表達式的代表指紋的哈希值,將所述正則表達式放入哈希槽中,并判斷放入的哈希槽中是否已存在正則表達式;
      [0021]在放入的哈希槽中已存在正則表達式時,若所述正則表達式的代表指紋和已存在正則表達式的代表指紋相同,則將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      [0022]結(jié)合第一方面的第四種實現(xiàn)方式,在第一方面的第五種實現(xiàn)方式中,所述將所述正則表達式和已存在正則表達式合并為一個正則表達式組之前,還包括:
      [0023]判斷所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量是否超過預(yù)設(shè)閾值;
      [0024]所述將所述正則表達式和已存在正則表達式合并為一個正則表達式組,具體包括:
      [0025]在所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量不超過預(yù)設(shè)閾值時,將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      [0026]結(jié)合第一方面或者第一方面的第一種實現(xiàn)方式或者第一方面的第二種實現(xiàn)方式或者第一方面的第三種實現(xiàn)方式或者第一方面的第四種實現(xiàn)方式或者第一方面的第五種實現(xiàn)方式,在第一方面的第六種實現(xiàn)方式中,所述確定所述正則表達式組的代表指紋,具體包括:
      [0027]將所述正則表達式組的指紋進行哈希,選擇哈希值在所有正則表達式組的代表指紋的哈希值中出現(xiàn)次數(shù)最少的指紋作為所述正則表達式組的代表指紋。
      [0028]第二方面,提供一種正則表達式匹配裝置,包括:
      [0029]第一確定單元,用于確定正則表達式的指紋;
      [0030]第二確定單元,用于根據(jù)所述正則表達式的指紋,確定所述正則表達式的代表指紋;
      [0031]第三確定單元,用于根據(jù)所述正則表達式的代表指紋,確定正則表達式組,并確定所述正則表達式組的代表指紋;
      [0032]匹配單元,用于基于所述正則表達式組的代表指紋與所述正則表達式組編譯成的確定有限狀態(tài)自動機DFA的對應(yīng)關(guān)系,對待匹配數(shù)據(jù)進行正則表達式匹配。
      [0033]結(jié)合第二方面,在第二方面的第一種實現(xiàn)方式中,所述第一確定單元,具體用于提取正則表達式的必經(jīng)字符串,并截取預(yù)設(shè)長度的所述必經(jīng)字符串作為所述正則表達式的指紋;所述必經(jīng)字符串為能夠匹配上所述正則表達式的數(shù)據(jù)中都包含的字符串。
      [0034]結(jié)合第二方面的第一種實現(xiàn)方式,在第二方面的第二種實現(xiàn)方式中,所述第一確定單元,具體用于當(dāng)正則表達式中至少包含嵌套元字符時,若最外層嵌套元字符中不包含分支元字符,且最外層嵌套元字符后沒有重復(fù)元字符,則提取刪除所述正則表達式的最外層嵌套元字符后的正則表達式的必經(jīng)字符串,作為所述正則表達式的必經(jīng)字符串;
      [0035]當(dāng)正則表達式中至少包含嵌套元字符和分支元字符時,若任何嵌套元字符中均不包含分支元字符,或僅最外層嵌套元字符包含分支元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串中都包含的字符串;
      [0036]當(dāng)正則表達式中至少包含嵌套元字符、分支元字符和重復(fù)元字符時,若任何嵌套元字符中均不包含重復(fù)元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串。
      [0037]結(jié)合第二方面或者第二方面的第一種實現(xiàn)方式或者第二方面的第二種實現(xiàn)方式,在第二方面的第三種實現(xiàn)方式中,所述第二確定單元,具體用于將所述正則表達式的指紋進行哈希,選擇哈希沖突最小的指紋作為所述正則表達式的代表指紋。
      [0038]結(jié)合第二方面或者第二方面的第一種實現(xiàn)方式或者第二方面的第二種實現(xiàn)方式或者第二方面的第三種實現(xiàn)方式,在第二方面的第四種實現(xiàn)方式中,所述第三確定單元,具體用于根據(jù)所述正則表達式的代表指紋的哈希值,將所述正則表達式放入哈希槽中,并判斷放入的哈希槽中是否已存在正則表達式;在放入的哈希槽中已存在正則表達式時,若所述正則表達式的代表指紋和已存在正則表達式的代表指紋相同,則將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      [0039]結(jié)合第二方面的第四種實現(xiàn)方式,在第二方面的第五種實現(xiàn)方式中,所述第三確定單元,還用于將所述正則表達式和已存在正則表達式合并為一個正則表達式組之前,判斷所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量是否超過預(yù)設(shè)閾值;
      [0040]所述第三確定單元,具體用于在所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量不超過預(yù)設(shè)閾值時,將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      [0041]結(jié)合第二方面或者第二方面的第一種實現(xiàn)方式或者第二方面的第二種實現(xiàn)方式或者第二方面的第三種實現(xiàn)方式或者第二方面的第四種實現(xiàn)方式或者第二方面的第五種實現(xiàn)方式,在第二方面的第六種實現(xiàn)方式中,所述第三確定單元,具體用于將所述正則表達式組的指紋進行哈希,選擇哈希值在所有正則表達式組的代表指紋的哈希值中出現(xiàn)次數(shù)最少的指紋作為所述正則表達式組的代表指紋。
      [0042]根據(jù)第一方面提供的正則表達式匹配方法,第二方面提供的正則表達式匹配裝置,基于正則表達式的指紋對正則表達式進行分組,而一個正則表達式可以具有多個指紋,因此,相比于現(xiàn)有技術(shù),基于正則表達式的指紋進行分組可以得到數(shù)量較少的正則表達式組,即正則表達式組編譯成的DFA的數(shù)量也較少,可以提高正則表達式匹配速度,并且不會占用大量的存儲空間。
      【專利附圖】

      【附圖說明】
      [0043]附圖用來提供對本發(fā)明的進一步理解,并且構(gòu)成說明書的一部分,與本發(fā)明實施例一起用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的限制。在附圖中:
      [0044]圖1為本發(fā)明實施例提供的正則表達式匹配方法的流程圖;
      [0045]圖2為本發(fā)明實施例提供的正則表達式匹配方法的詳細流程圖;
      [0046]圖3為本發(fā)明實施例提供的正則表達式預(yù)分組方法的流程圖;
      [0047]圖4為本發(fā)明實施例提供的有向圖;
      [0048]圖5為本發(fā)明實施例提供的待匹配數(shù)據(jù)正則表達式匹配方法的流程圖;
      [0049]圖6為本發(fā)明實施例提供的正則表達式匹配裝置的結(jié)構(gòu)示意圖之一;
      [0050]圖7為本發(fā)明實施例提供的正則表達式匹配裝置的結(jié)構(gòu)示意圖之二 ;
      [0051]圖8為本發(fā)明實施例提供的正則表達式匹配設(shè)備的結(jié)構(gòu)示意圖。
      【具體實施方式】
      [0052]為了給出提高正則表達式匹配速度的實現(xiàn)方案,本發(fā)明實施例提供了一種正則表達式匹配方法及裝置,以下結(jié)合說明書附圖對本發(fā)明的優(yōu)選實施例進行說明,應(yīng)當(dāng)理解,此處所描述的優(yōu)選實施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。并且在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。
      [0053]本發(fā)明實施例提供一種正則表達式匹配方法,如圖1所示,包括:
      [0054]步驟101、確定正則表達式的指紋;
      [0055]步驟102、根據(jù)該正則表達式的指紋,確定該正則表達式的代表指紋;
      [0056]步驟103、根據(jù)該正則表達式的代表指紋,確定正則表達式組,并確定該正則表達式組的代表指紋;
      [0057]步驟104、基于該正則表達式組的代表指紋與該正則表達式組編譯成的確定有限狀態(tài)自動機DFA的對應(yīng)關(guān)系,對待匹配數(shù)據(jù)進行正則表達式匹配。
      [0058]可見,上述正則表達式匹配方法是基于正則表達式的指紋對正則表達式進行分組,由于每個正則表達式可以具有多個指紋,因此,基于正則表達式的指紋進行分組得到的正則表達式組的數(shù)量較少,即正則表達式組編譯成的DFA數(shù)量較少,即采用上述正則表達式匹配方法,不但能夠提高正則表達式的匹配速度,還能夠節(jié)省存儲空間。
      [0059]進一步的,正則表達式的指紋為預(yù)設(shè)長度的字符串,且該預(yù)設(shè)長度的字符串包含在能夠和該正則表達式匹配的所有數(shù)據(jù)中,因此,上述步驟101確定正則表達式的指紋,具體可以包括:提取正則表達式的必經(jīng)字符串,并截取預(yù)設(shè)長度的該必經(jīng)字符串作為該正則表達式的指紋;該必經(jīng)字符串為能夠匹配上該正則表達式的數(shù)據(jù)中都包含的字符串。
      [0060]上述提取正則表達式的必經(jīng)字符串,具體可以包括:
      [0061]當(dāng)正則表達式中至少包含嵌套元字符時,若最外層嵌套元字符中不包含分支元字符,且最外層嵌套元字符后沒有重復(fù)元字符,則提取刪除該正則表達式的最外層嵌套元字符后的正則表達式的必經(jīng)字符串,作為該正則表達式的必經(jīng)字符串;
      [0062]當(dāng)正則表達式中至少包含嵌套元字符和分支元字符時,若任何嵌套元字符中均不包含分支元字符,或僅最外層嵌套元字符包含分支元字符,確定該正則表達式包括的不包含分支元字符的分支正則表達式;提取該分支正則表達式的必經(jīng)字符串;確定該正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串中都包含的字符串;
      [0063]當(dāng)正則表達式中至少包含嵌套元字符、分支元字符和重復(fù)元字符時,若任何嵌套元字符中均不包含重復(fù)元字符,確定該正則表達式包括的不包含分支元字符的分支正則表達式;提取該分支正則表達式的必經(jīng)字符串;確定該正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串;
      [0064]其它情況不再 列舉。
      [0065]其中,分支正則表達式的必經(jīng)字符串為能夠匹配上該分支正則表達式的數(shù)據(jù)中都包含的字符串。
      [0066]進一步的,步驟102根據(jù)正則表達式的指紋,確定該正則表達式的代表指紋,可以從該正則表達式的所有指紋中隨機選擇一個指紋作為該正則表達式的代表指紋。較佳的,可以將該正則表達式的指紋進行哈希,選擇哈希沖突最小的指紋作為該正則表達式的代表指紋。
      [0067]選擇哈希沖突最小的指紋作為正則表達式的代表指紋,能夠在正則表達式分組時,盡量避免哈希沖突,使代表指紋的哈希值相同的正則表達式盡量合并為一個正則表達式組,因此能夠減少正則表達式組的數(shù)量,從而減少編譯成的DFA的數(shù)量,提高正則表達式的匹配速度。
      [0068]進一步的,步驟103根據(jù)正則表達式的代表指紋,確定正則表達式組,具體包括:根據(jù)該正則表達式的代表指紋的哈希值,將該正則表達式放入哈希槽中,并判斷放入的哈希槽中是否已存在正則表達式;在放入的哈希槽中已存在正則表達式時,若該正則表達式的代表指紋和已存在正則表達式的代表指紋相同,則將該正則表達式和已存在正則表達式合并為一個正則表達式組。
      [0069]較佳的,在合并之前,還可以考慮到正則表達式組編譯成的DFA的大小,為避免編譯成的DFA過大,具體可以在將該正則表達式和已存在正則表達式合并為一個正則表達式組之前,判斷該正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量是否超過預(yù)設(shè)閾值;在該正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量不超過預(yù)設(shè)閾值時,才將該正則表達式和已存在正則表達式合并為一個正則表達式組。
      [0070]由于正則表達式組編譯成的DFA過大時不但會占用較大的存儲空間,更會降低后續(xù)正則表達式匹配時的匹配速度,因此,采用在該正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量不超過預(yù)設(shè)閾值時,才將該正則表達式和已存在正則表達式合并為一個正則表達式組的方案,不但能夠節(jié)省正則表達式組編譯成的DFA占用的存儲空間,更能夠提高正則表達式的匹配速度。
      [0071]較佳的,步驟103確定正則表達式組的代表指紋,具體包括:將該正則表達式組的指紋進行哈希,選擇哈希值在所有正則表達式組的代表指紋的哈希值中出現(xiàn)次數(shù)最少的指紋作為該正則表達式組的代表指紋。
      [0072]選擇哈希值在所有正則表達式組的代表指紋的哈希值中出現(xiàn)次數(shù)最少的指紋作為該正則表達式組的代表指紋,即可以使各正則表達式組的代表指紋的哈希值盡量不同,使各正則表達式組盡量放入不同的哈希槽中,進行正則表達式的匹配時,能夠提高配速度。
      [0073]較佳的,在執(zhí)行步驟104對待匹配數(shù)據(jù)進行正則表達式匹配之前,還可以對各正則表達式組進行合并調(diào)整,以進一步減少正則表達式組的數(shù)量,該合并調(diào)整步驟具體可以包括:
      [0074]合并具有相同代表指紋的不同正則表達式組,合并后的正則表達式組的代表指紋為該相同代表指紋;
      [0075]合并具有至少指定數(shù)量個相同指紋的不同正則表達式組,并確定該合并后的正則表達式組的代表指紋。
      [0076]較佳的,在合并不同正則表達式組之前,也可以考慮到正則表達式組編譯成的DFA的大小,具體可以在合并不同正則表達式組之前,判斷合并后的正則表達式組編譯成的DFA狀態(tài)數(shù)量是否超過預(yù)設(shè)閾值;在合并后的正則表達式組編譯成的DFA狀態(tài)數(shù)量不超過預(yù)設(shè)閾值時,才將該不同正則表達式組合并為一個正則表達式組。
      [0077]通過對符合條件的不同正則表達式組進行合并,可以進一步減少正則表達式組的數(shù)量,進而可以減少編譯成的DFA的數(shù)量,因此,可以進一步提高正則表達式的匹配速度。
      [0078]本發(fā)明實施例提供的正則表達式匹配方法可應(yīng)用于深度包檢測(De印packetinspection, DPI)、文本匹配、文檔內(nèi)容檢索等領(lǐng)域。
      [0079]即本發(fā)明實施例提供的正則表達式匹配方法需要先基于正則表達式的指紋對正則表達式進行分組,確定各正則表達式組后,將每個正則表達式組編譯成一個DFA,建立正則表達式組的代表指紋與DFA的對應(yīng)關(guān)系。
      [0080]下面結(jié)合附圖,用具體實施例對本發(fā)明提供的正則表達式匹配方案進行詳細描述。
      [0081]圖2所示為本發(fā)明實施例提供的正則表達式匹配方法的詳細流程圖,具體包括:
      [0082]步驟201、確定各正則表達式的所有指紋。
      [0083]具體為先提取正則表達式的必經(jīng)字符串,再截取預(yù)設(shè)長度的該必經(jīng)字符串作為該正則表達式的指紋。
      [0084]由于正則表達式的多樣化,包含的情況較多,下面列舉一些情況,結(jié)合具體例子說明如何確定正則表達式的指紋,在以下例子中,指紋的長度即預(yù)設(shè)長度具體為3。
      [0085]例1:正則表達式“a(bcd)ef”,包含一層嵌套元字符“ O ”,這層嵌套元字符中不包含分支元字符“ I ”,且后面也沒有重復(fù)元字符,故可以將嵌套元字符“ O ”刪除后得到正則表達式“a(bcd)ef”的必經(jīng)字符串“abcdef”,因此,正則表達式“a(bcd)ef”的指紋為“abc”、“bcd”、“cde” 和 “def”。
      [0086]例2:正則表達式“abc+de”,包含重復(fù)元字符“ + ”,表示字符“c”重復(fù)一次或多次。在提取正則表達式“abc+de”的必經(jīng)字符串時,可以將正則表達式“abc+de”拆分為兩個分支正則表達式“abc”和“cde”,分支正則表達式“abc”的必經(jīng)字符串即為“abc”,分支正則表達式“ cde ”的必經(jīng)字符串即為“ cde ”,正則表達式“abc+de ”的必經(jīng)字符串即為“abc ”和“ cde ”,因此,正則表達式“abc+de ”的指紋為“abc ”和“ cde ”。
      [0087]例3:正則表達式“a (be)+f”,包含嵌套元字符“ O ”、重復(fù)元字符“ + ”,表示字符串“be”重復(fù)一次或多次。和例2類似,在提取正則表達式“a(bc)+f”的必經(jīng)字符串時,可以將正則表達式“a (be) +f”拆分為兩個分支正則表達式“a (be) ”和“ (be) f”。和例I類似,可以刪去兩個分支正則表達式中的嵌套元字符“ O ”,得到“abc”和“bef”,分支正則表達式"a (be) ”的必經(jīng)字符串即為“abc”,分支正則表達式“(be) f ”的必經(jīng)字符串即為“bef ”,正則表達式“a (be) +f ”的必經(jīng)字符串即為“abc”和“bef ”,因此,正則表達式“a (be) +f ”的指紋為 “abc” 和 “bef”。
      [0088]例4:正則表達式“aed(bc)*fac”,包含嵌套元字符“ O ”、重復(fù)元字符“*”,表示字符串“be”重復(fù)零次或多次。在提取正則表達式“aed(bc)*fac”的必經(jīng)字符串時,可以將正則表達式“aed(bc)*fac”拆分為兩個分支正則表達式“aed”和“fac”,分支正則表達式“aed”的必經(jīng)字符串即為“aed”,分支正則表達式“fac”的必經(jīng)字符串即為“fac”,正則表達式“aed (be) *fac ”的必經(jīng)字符串即為“ aed”和“ fac ”,因此,正則表達式“aed (be) *fac ’,的指紋為“aed”和“fac”。
      [0089]對于包含重復(fù)元字符“? ”以及包含重復(fù)元字符“ {,m} ”的正則表達式和例4類似,在此不再詳述。
      [0090]例5:正則表達式“ab{5,} C”,包含重復(fù)元字符“ {n,} ”,表示字符“b”重復(fù)至少五次。在提取正則表達式“ab {5,}c”的必經(jīng)字符串時,可以將正則表達式“ab {5,}c”拆分為兩個分支正則表達式“abbbbb”和“bbbbbc”,分支正則表達式“abbbbb”的必經(jīng)字符串即為“abbbbb”,分支正則表達式“bbbbbc”的必經(jīng)字符串即為“bbbbbc”,正則表達式“ab {5,} c”的必經(jīng)字符串即為“abbbbb”和“bbbbbc”,因此,正則表達式“ab {5,} c”的指紋為“abb”、“bbb” 和 “bbc”。
      [0091]上述例5中,若設(shè)置了必經(jīng)字符串的長度閾值k,當(dāng)n>k時,將前面的字符或子表達式重復(fù)k次即可。
      [0092]對于包含重復(fù)元字符“ {n,m} ”的正則表達式和例5類似,在此不再詳述。
      [0093]例6:正則表達式“accdelaccbf”,包含分支元字符“|”。在提取正則表達式“accde Iaccbf ”的必經(jīng)字符串時,可以將正則表達式“accde Iaccbf ”拆分為兩個分支正則表達式“accde”和“accbf ”,分支正則表達式“accde”的必經(jīng)字符串即為“accde”,分支正則表達式“accbf”的必經(jīng)字符串即為“accde”,正則表達式“accde | accbf”的必經(jīng)字符串為“accde”和“accde”中都包含的字符串,即“acc”,因此,“accde | accbf”的指紋為“acc”。
      [0094]例7:正則表達式“abC[aeiou]fg”,包含元字符“ □”,表示匹配任何一個英文元音字母。在提取正則表達式“abC[aeiou]fg”的必經(jīng)字符串時,可以將正則表達式“abc [aeiou] fg”拆分為兩個分支正則表達式“abc”和“fg”,分支正則表達式“abc”的必經(jīng)字符串即為“abc”,分支正則表達式“fg”的必經(jīng)字符串即為“fg”,正則表達式“abC[aei0u]fg”的必經(jīng)字符串為“abc”和“fg”中都包含的字符串,因此,正則表達式“abc [aeiou] fg”不存在指紋。
      [0095]例8:正則表達式“ca(bcd|bed)f”,包含一層嵌套元字符“ O ”,在這一層嵌套元字符“ O ”中包含分支元字符“ I ”。在提取正則表達式“ca(bcd|bed)f”的必經(jīng)字符串時,可以將正則表達式“ca (bed |bed) f”拆分為兩個分支正則表達式“ca (bed) f”和“ca (bde)f”。和例I類似,可以刪去兩個分支正則表達式中的嵌套元字符“ O ”,得到“cabcdf”和“cabdef”。分支正則表達式“ca(bed) f”的必經(jīng)字符串即為“cabcdf ”,分支正則表達式“ca(bde)f”的必經(jīng)字符串即為“cabdef”,正則表達式“ca(bcd |bed) f”的必經(jīng)字符串為“cabcdf ”和“ cabdef”中都包含的字符串,即“ cab ”,因此,正則表達式“ ca (bed | bed) f ”的指紋為“ cab ”。 [0096]例9:正則表達式“aab((ce) {2,3} d | cd)+bex”,包含兩層嵌套元字符,并具有多種需要按不同情況處理的元字符。首先根據(jù)重復(fù)元字符“ + ”,將其拆分為兩個分支正則表達式“ aab ((ce) {2,3} d | cd) ” 和 “((ce) {2,3} d | cd) bex ” ;
      [0097]其中分支正則表達式“ aab ((ce) {2,3} d I Cd) ”可再拆分為 “ aab ((ce) {2,3} d) ”和“aab (Cd) ”,刪除“aab ((ce) {2,3} d) ”和“aab (cd) ”中的最外層嵌套元字符“ O ”,得到“aab (ce) {2, 3} ” 和 “aabed” ;
      [0098]上述“aab (ce) {2,3) ” 可再拆分為 “aabcece” 和 “cece” ;“aabcece” 的必經(jīng)字符串即為“aabcece ”,“ cece ”的必經(jīng)字符串即為“ cece ”,“aab (ce) {2,3} ”的必經(jīng)字符串即為“aabcece” 和 “cece” ;
      [0099]上述“aabed”的必經(jīng)字符串即為“aabed” ;
      [0100]分支正則表達式“aab ((ce) {2,3} d| cd) ”的必經(jīng)字符串為“aab (ce) {2,3}”的必經(jīng)字符串和“aabed”的必經(jīng)字符串中都包含的字符串,即“aabc” ;
      [0101]另一分支正則表達式“((ce) {2, 3} d I cd)bex” 可拆分為 “((ce) {2, 3} d)bex” 和“ (Cd)beX”J^“((Ce) {2,3}d)bex”和“(cd)bex”中的最外層嵌套元字符“ O ”,得到“ (ce){2, 3} dbex” 和 “cdbex” ;
      [0102]上述“(ce){2,3} dbex” 可再拆分為 “cece” 和 “cecedbex” ;“cece” 的必經(jīng)字符串即為“ cece ”,“ cecedbex”的必經(jīng)字符串即為“ cecedbex”,“ (ce) {2,3} dbex”的必經(jīng)字符串即為 “cece” 和 “cecedbex” ;
      [0103]上述“cdbex”的必經(jīng)字符串即為“cdbex” ;
      [0104]分支正則表達式“((ce) {2,3}d|cd)bex”的必經(jīng)字符串為“(ce) {2,3}dbex”的必經(jīng)字符串和“cdbex”的必經(jīng)字符串中都包含的字符串,即“dbex” ;
      [0105]正則表達式“aab ((ce) {2,3} d | cd) +bex”的必經(jīng)字符串為分支正則表達式“aab ((ce) {2,3} d | cd) ”和“ ((ce) {2,3} d | cd) bex”的所有必經(jīng)字符串,SP“aabc”和“dbex”,因此,正則表達式 “aab ((ce) {2,3} d | cd) +bex” 的指紋為 “aab”、“abc”、“bde” 和 “bex”。
      [0106]上述正則表達式拆分后的分支正則表達式并不一定跟原始的正則表達式有完全相同的語義,只要分支正則表達式能涵括所有必經(jīng)字符串即可。
      [0107]步驟202、確定各正則表達式的代表指紋。
      [0108]具體可以將正則表達式的各指紋進行哈希,選擇和其它正則表達式的代表指紋哈希沖突最小的指紋作為該正則表達式的代表指紋。
      [0109]步驟203、對正則表達式進行預(yù)分組,將具有相同代表指紋的正則表達式分為一個正則表達式組。
      [0110]較佳的,可以在正則表達式組編譯成的DFA的狀態(tài)的數(shù)量不超過預(yù)設(shè)閾值的前提條件下,對正則表達式進行預(yù)分組。[0111]得到的正則表達式組中的各個正則表達式具有的所有相同指紋為該正則表達式組的指紋。
      [0112]在本發(fā)明實施例中,正則表達式的預(yù)分組具體可以在哈希表中實現(xiàn),具體實現(xiàn)流程如圖3所示,包括:
      [0113]步驟301、將當(dāng)前正在進行處理的正則表達式看作一個僅包含一個正則表達式的正則表達式組,當(dāng)前正在進行處理的正則表達式的代表指紋作為該正則表達式組的預(yù)分組指紋。[0114]為便于區(qū)分,該正則表達式組下文中稱為當(dāng)前正則表達式組。
      [0115]步驟302、判斷該哈希槽中是否存在其它正則表達式組。
      [0116]若確定該哈希槽中存在其它正則表達式組,則進入步驟303 ;若確定該哈希槽中不存在其它正則表達式組,則該哈希槽原為一個空槽,結(jié)束本次流程。
      [0117]步驟303、判斷該其它正則表達式組中是否存在預(yù)分組指紋和當(dāng)前正則表達式組的預(yù)分組指紋相同的指定正則表達式組。
      [0118]若確定該其它正則表達式組中存在預(yù)分組指紋和當(dāng)前正則表達式組的預(yù)分組指紋相同的指定正則表達式組,則進入步驟304;若確定該其它正則表達式組中不存在預(yù)分組指紋和當(dāng)前正則表達式組的預(yù)分組指紋相同的指定正則表達式組,則結(jié)束本次流程。
      [0119]步驟304、判斷當(dāng)前正則表達式組和該指定正則表達式組合并后的正則表達式組編譯成的DFA的狀態(tài)的數(shù)量是否會超過預(yù)設(shè)閾值。
      [0120]若確定當(dāng)前正則表達式組和該指定正則表達式組合并后的正則表達式組編譯成的DFA的狀態(tài)的數(shù)量不會超過預(yù)設(shè)閾值,則進入步驟305,若確定當(dāng)前正則表達式組和該指定正則表達式組合并后的正則表達式組編譯成的DFA的狀態(tài)的數(shù)量會超過預(yù)設(shè)閾值,則結(jié)束本次流程。
      [0121]步驟305、將當(dāng)前正則表達式組和該指定正則表達式組進行合并,合并后的正則表達式組的預(yù)分組指紋為當(dāng)前正則表達式組和該指定正則表達式組具有的相同的預(yù)分組指紋。
      [0122]下面用具體例子對上述預(yù)分組流程進行說明:
      [0123]假設(shè)對10個正則表達式rl、r2……rlO進行預(yù)分組,經(jīng)過步驟201確定的各正則表達式rl、r2......rlO的指紋如下表所示:
      [0124]
      正則表達式指紋
      rlabc, efg
      r2abc, efg
      r3Imn,opq
      r4Imn, opq
      r5abc,hij
      【權(quán)利要求】
      1.一種正則表達式匹配方法,其特征在于,包括: 確定正則表達式的指紋; 根據(jù)所述正則表達式的指紋,確定所述正則表達式的代表指紋; 根據(jù)所述正則表達式的代表指紋,確定正則表達式組,并確定所述正則表達式組的代表指紋; 基于所述正則表達式組的代表指紋與所述正則表達式組編譯成的確定有限狀態(tài)自動機DFA的對應(yīng)關(guān)系,對待匹配數(shù)據(jù)進行正則表達式匹配。
      2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述確定正則表達式的指紋,具體包括: 提取正則表達式的必經(jīng)字符串,并截取預(yù)設(shè)長度的所述必經(jīng)字符串作為所述正則表達式的指紋;所述必經(jīng)字符串為能夠匹配上所述正則表達式的數(shù)據(jù)中都包含的字符串。
      3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述提取正則表達式的必經(jīng)字符串,具體包括: 當(dāng)正則表達式中至少包含嵌套元字符時,若最外層嵌套元字符中不包含分支元字符,且最外層嵌套元字符后沒有重復(fù)元字符,則提取刪除所述正則表達式的最外層嵌套元字符后的正則表達式的必經(jīng)字符串,作為所述正則表達式的必經(jīng)字符串; 當(dāng)正則表達式中至少包含嵌套元字符和分支元字符時,若任何嵌套元字符中均不包含分支元字符,或僅最外層嵌套元字符包含分支元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串中都包含的字符串; 當(dāng)正則表達式中至少包含嵌套元字`符、分支元字符和重復(fù)元字符時,若任何嵌套元字符中均不包含重復(fù)元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串。
      4.根據(jù)權(quán)利要求1至3任一所述的方法,其特征在于,所述根據(jù)所述正則表達式的指紋,確定所述正則表達式的代表指紋,具體包括: 將所述正則表達式的指紋進行哈希,選擇哈希沖突最小的指紋作為所述正則表達式的代表指紋。
      5.根據(jù)權(quán)利要求1至4任一所述的方法,其特征在于,所述根據(jù)所述正則表達式的代表指紋,確定正則表達式組,具體包括: 根據(jù)所述正則表達式的代表指紋的哈希值,將所述正則表達式放入哈希槽中,并判斷放入的哈希槽中是否已存在正則表達式; 在放入的哈希槽中已存在正則表達式時,若所述正則表達式的代表指紋和已存在正則表達式的代表指紋相同,則將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述將所述正則表達式和已存在正則表達式合并為一個正則表達式組之前,還包括: 判斷所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量是否超過預(yù)設(shè)閾值; 所述將所述正則表達式和已存在正則表達式合并為一個正則表達式組,具體包括:在所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量不超過預(yù)設(shè)閾值時,將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      7.根據(jù)權(quán)利要求1至6任一所述的方法,其特征在于,所述確定所述正則表達式組的代表指紋,具體包括: 將所述正則表達式組的指紋進行哈希,選擇哈希值在所有正則表達式組的代表指紋的哈希值中出現(xiàn)次數(shù)最少的指紋作為所述正則表達式組的代表指紋。
      8.一種正則表達式匹配裝置,其特征在于,包括: 第一確定單元,用于確定正則表達式的指紋; 第二確定單元,用于根據(jù)所述正則表達式的指紋,確定所述正則表達式的代表指紋; 第三確定單元,用于根據(jù)所述正則表達式的代表指紋,確定正則表達式組,并確定所述正則表達式組的代表指紋; 匹配單元,用于基于所述正則表達式組的代表指紋與所述正則表達式組編譯成的確定有限狀態(tài)自動機DFA的對應(yīng)關(guān)系,對待匹配數(shù)據(jù)進行正則表達式匹配。
      9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述第一確定單元,具體用于提取正則表達式的必經(jīng)字符串,并截取預(yù)設(shè)長度的所述必經(jīng)字符串作為所述正則表達式的指紋;所述必經(jīng)字符串為能夠匹配上所述正則表達式的數(shù)據(jù)中都包含的字符串。
      10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述第一確定單元,具體用于當(dāng)正則表達式中至少包含嵌套元字符時,若最外層嵌套元字符中不包含分支元字符,且最外層嵌套元字符后沒有重復(fù)元字符,則提取刪除所述正則表達式的最外層嵌套元字符后的正則表達式的必經(jīng)字符串,作為所述正則表達式的必經(jīng)字符串; 當(dāng)正則表達式中至少包含嵌套元字符和分支元字符時,若任何嵌套元字符中均不包含分支元字符,或僅最外層嵌套元字符包含分支元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串中都包含的字符串; 當(dāng)正則表達式中至少包含嵌套元字符、分支元字符和重復(fù)元字符時,若任何嵌套元字符中均不包含重復(fù)元字符,確定所述正則表達式包括的不包含分支元字符的分支正則表達式;提取所述分支正則表達式的必經(jīng)字符串;確定所述正則表達式的必經(jīng)字符串為所有分支正則表達式的必經(jīng)字符串。
      11.根據(jù)權(quán)利要求8至10任一所述的裝置,其特征在于,所述第二確定單元,具體用于將所述正則表達式的指紋進行哈希,選擇哈希沖突最小的指紋作為所述正則表達式的代表指紋。
      12.根據(jù)權(quán)利要求8至11任一所述的裝置,其特征在于,所述第三確定單元,具體用于根據(jù)所述正則表達式的代表指紋的哈希值,將所述正則表達式放入哈希槽中,并判斷放入的哈希槽中是否已存在正則表達式;在放入的哈希槽中已存在正則表達式時,若所述正則表達式的代表指紋和已存在正則表達式的代表指紋相同,則將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      13.根據(jù)權(quán)利要求12所述的裝置,其特征在于,所述第三確定單元,還用于將所述正則表達式和已存在正則表達式合并為一個正則表達式組之前,判斷所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量是否超過預(yù)設(shè)閾值; 所述第三確定單元,具體用于在所述正則表達式和已存在正則表達式合并為一個正則表達式組后編譯成的DFA狀態(tài)數(shù)量不超過預(yù)設(shè)閾值時,將所述正則表達式和已存在正則表達式合并為一個正則表達式組。
      14.根據(jù)權(quán)利要求8至13任一所述的裝置,其特征在于,所述第三確定單元,具體用于將所述正則表達式組的指紋進行哈希,選擇哈希值在所有正則表達式組的代表指紋的哈希值中出現(xiàn)次數(shù)最少的指紋作為所述正則表達式組的代表指紋。
      【文檔編號】G06F17/30GK103617226SQ201310603980
      【公開日】2014年3月5日 申請日期:2013年11月25日 優(yōu)先權(quán)日:2013年11月25日
      【發(fā)明者】王宇平, 王雨濛 申請人:華為技術(shù)有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1