一种正则表达式匹配方法及装置制造方法

文档序号:6520511阅读:193来源:国知局
一种正则表达式匹配方法及装置制造方法
【专利摘要】本发明公开了一种正则表达式匹配方法及装置,用以提高正则表达式的匹配速度。该方法包括:确定正则表达式的指纹;根据该正则表达式的指纹,确定该正则表达式的代表指纹;根据该正则表达式的代表指纹,确定正则表达式组,并确定该正则表达式组的代表指纹;基于该正则表达式组的代表指纹与该正则表达式组编译成的确定有限状态自动机DFA的对应关系,对待匹配数据进行正则表达式匹配。
【专利说明】一种正则表达式匹配方法及装置【技术领域】
[0001]本发明涉及数据处理领域,尤其涉及一种正则表达式匹配方法及装置。
【背景技术】
[0002]正则表达式可以用简单的语法描述复杂的数据特征,因此被广泛应用于网络入侵检测、文档内容检索等多个领域。
[0003]判断待匹配数据中是否包含正则表达式所描述的数据特征,称为正则表达式的匹配。目前的正则表达式匹配方案中通常会将包含相同的字符串的正则表达式分为一组,该相同的字符串称为该正则表达式组的广义字符串,然后将每个正则表达式组编译成一个确定有限状态自动机(Deterministic Finite Automaton,DFA),建立每个正则表达式组的广义字符串与DFA的对应关系,在进行匹配时,先将待匹配数据和各正则表达式组的广义字符串进行匹配,确定出待匹配数据中包含正则表达式组的广义字符串时,获取与该包含的广义字符串对应的DFA,每个DFA由多个状态以及状态之间的转移边构成,根据获取的DFA通过状态跳转的方式实现正则表达式的匹配。
[0004]然而,采用上述方案将会生成大量的DFA,不但会占用大量的存储空间,还会导致匹配速度较慢。
【发明内容】

[0005]本发明实施例提供一种正则表达式匹配方法及装置,用以解决正则表达式匹配速度较慢的问题。
[0006]第一方面,提供一种正则表达式匹配方法,包括:
[0007]确定正则表达式的指纹;
[0008]根据所述正则表达式的指纹,确定所述正则表达式的代表指纹;
[0009]根据所述正则表达式的代表指纹,确定正则表达式组,并确定所述正则表达式组的代表指纹;
[0010]基于所述正则表达式组的代表指纹与所述正则表达式组编译成的确定有限状态自动机DFA的对应关系,对待匹配数据进行正则表达式匹配。
[0011]结合第一方面,在第一方面的第一种实现方式中,所述确定正则表达式的指纹,具体包括:
[0012]提取正则表达式的必经字符串,并截取预设长度的所述必经字符串作为所述正则表达式的指纹;所述必经字符串为能够匹配上所述正则表达式的数据中都包含的字符串。
[0013]结合第一方面的第一种实现方式,在第一方面的第二种实现方式中,所述提取正则表达式的必经字符串,具体包括:
[0014]当正则表达式中至少包含嵌套元字符时,若最外层嵌套元字符中不包含分支元字符,且最外层嵌套元字符后没有重复元字符,则提取删除所述正则表达式的最外层嵌套元字符后的正则表达式的必经字符串,作为所述正则表达式的必经字符串;[0015]当正则表达式中至少包含嵌套元字符和分支元字符时,若任何嵌套元字符中均不包含分支元字符,或仅最外层嵌套元字符包含分支元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串中都包含的字符串;
[0016]当正则表达式中至少包含嵌套元字符、分支元字符和重复元字符时,若任何嵌套元字符中均不包含重复元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串。
[0017]结合第一方面或者第一方面的第一种实现方式或者第一方面的第二种实现方式,在第一方面的第三种实现方式中,所述根据所述正则表达式的指纹,确定所述正则表达式的代表指纹,具体包括:
[0018]将所述正则表达式的指纹进行哈希,选择哈希冲突最小的指纹作为所述正则表达式的代表指纹。
[0019]结合第一方面或者第一方面的第一种实现方式或者第一方面的第二种实现方式或者第一方面的第三种实现方式,在第一方面的第四种实现方式中,所述根据所述正则表达式的代表指纹,确定正则表达式组,具体包括:
[0020]根据所述正则表达式的代表指纹的哈希值,将所述正则表达式放入哈希槽中,并判断放入的哈希槽中是否已存在正则表达式;
[0021]在放入的哈希槽中已存在正则表达式时,若所述正则表达式的代表指纹和已存在正则表达式的代表指纹相同,则将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
[0022]结合第一方面的第四种实现方式,在第一方面的第五种实现方式中,所述将所述正则表达式和已存在正则表达式合并为一个正则表达式组之前,还包括:
[0023]判断所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量是否超过预设阈值;
[0024]所述将所述正则表达式和已存在正则表达式合并为一个正则表达式组,具体包括:
[0025]在所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量不超过预设阈值时,将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
[0026]结合第一方面或者第一方面的第一种实现方式或者第一方面的第二种实现方式或者第一方面的第三种实现方式或者第一方面的第四种实现方式或者第一方面的第五种实现方式,在第一方面的第六种实现方式中,所述确定所述正则表达式组的代表指纹,具体包括:
[0027]将所述正则表达式组的指纹进行哈希,选择哈希值在所有正则表达式组的代表指纹的哈希值中出现次数最少的指纹作为所述正则表达式组的代表指纹。
[0028]第二方面,提供一种正则表达式匹配装置,包括:
[0029]第一确定单元,用于确定正则表达式的指纹;
[0030]第二确定单元,用于根据所述正则表达式的指纹,确定所述正则表达式的代表指纹;
[0031]第三确定单元,用于根据所述正则表达式的代表指纹,确定正则表达式组,并确定所述正则表达式组的代表指纹;
[0032]匹配单元,用于基于所述正则表达式组的代表指纹与所述正则表达式组编译成的确定有限状态自动机DFA的对应关系,对待匹配数据进行正则表达式匹配。
[0033]结合第二方面,在第二方面的第一种实现方式中,所述第一确定单元,具体用于提取正则表达式的必经字符串,并截取预设长度的所述必经字符串作为所述正则表达式的指纹;所述必经字符串为能够匹配上所述正则表达式的数据中都包含的字符串。
[0034]结合第二方面的第一种实现方式,在第二方面的第二种实现方式中,所述第一确定单元,具体用于当正则表达式中至少包含嵌套元字符时,若最外层嵌套元字符中不包含分支元字符,且最外层嵌套元字符后没有重复元字符,则提取删除所述正则表达式的最外层嵌套元字符后的正则表达式的必经字符串,作为所述正则表达式的必经字符串;
[0035]当正则表达式中至少包含嵌套元字符和分支元字符时,若任何嵌套元字符中均不包含分支元字符,或仅最外层嵌套元字符包含分支元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串中都包含的字符串;
[0036]当正则表达式中至少包含嵌套元字符、分支元字符和重复元字符时,若任何嵌套元字符中均不包含重复元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串。
[0037]结合第二方面或者第二方面的第一种实现方式或者第二方面的第二种实现方式,在第二方面的第三种实现方式中,所述第二确定单元,具体用于将所述正则表达式的指纹进行哈希,选择哈希冲突最小的指纹作为所述正则表达式的代表指纹。
[0038]结合第二方面或者第二方面的第一种实现方式或者第二方面的第二种实现方式或者第二方面的第三种实现方式,在第二方面的第四种实现方式中,所述第三确定单元,具体用于根据所述正则表达式的代表指纹的哈希值,将所述正则表达式放入哈希槽中,并判断放入的哈希槽中是否已存在正则表达式;在放入的哈希槽中已存在正则表达式时,若所述正则表达式的代表指纹和已存在正则表达式的代表指纹相同,则将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
[0039]结合第二方面的第四种实现方式,在第二方面的第五种实现方式中,所述第三确定单元,还用于将所述正则表达式和已存在正则表达式合并为一个正则表达式组之前,判断所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量是否超过预设阈值;
[0040]所述第三确定单元,具体用于在所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量不超过预设阈值时,将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
[0041]结合第二方面或者第二方面的第一种实现方式或者第二方面的第二种实现方式或者第二方面的第三种实现方式或者第二方面的第四种实现方式或者第二方面的第五种实现方式,在第二方面的第六种实现方式中,所述第三确定单元,具体用于将所述正则表达式组的指纹进行哈希,选择哈希值在所有正则表达式组的代表指纹的哈希值中出现次数最少的指纹作为所述正则表达式组的代表指纹。
[0042]根据第一方面提供的正则表达式匹配方法,第二方面提供的正则表达式匹配装置,基于正则表达式的指纹对正则表达式进行分组,而一个正则表达式可以具有多个指纹,因此,相比于现有技术,基于正则表达式的指纹进行分组可以得到数量较少的正则表达式组,即正则表达式组编译成的DFA的数量也较少,可以提高正则表达式匹配速度,并且不会占用大量的存储空间。
【专利附图】

【附图说明】
[0043]附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
[0044]图1为本发明实施例提供的正则表达式匹配方法的流程图;
[0045]图2为本发明实施例提供的正则表达式匹配方法的详细流程图;
[0046]图3为本发明实施例提供的正则表达式预分组方法的流程图;
[0047]图4为本发明实施例提供的有向图;
[0048]图5为本发明实施例提供的待匹配数据正则表达式匹配方法的流程图;
[0049]图6为本发明实施例提供的正则表达式匹配装置的结构示意图之一;
[0050]图7为本发明实施例提供的正则表达式匹配装置的结构示意图之二 ;
[0051]图8为本发明实施例提供的正则表达式匹配设备的结构示意图。
【具体实施方式】
[0052]为了给出提高正则表达式匹配速度的实现方案,本发明实施例提供了一种正则表达式匹配方法及装置,以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
[0053]本发明实施例提供一种正则表达式匹配方法,如图1所示,包括:
[0054]步骤101、确定正则表达式的指纹;
[0055]步骤102、根据该正则表达式的指纹,确定该正则表达式的代表指纹;
[0056]步骤103、根据该正则表达式的代表指纹,确定正则表达式组,并确定该正则表达式组的代表指纹;
[0057]步骤104、基于该正则表达式组的代表指纹与该正则表达式组编译成的确定有限状态自动机DFA的对应关系,对待匹配数据进行正则表达式匹配。
[0058]可见,上述正则表达式匹配方法是基于正则表达式的指纹对正则表达式进行分组,由于每个正则表达式可以具有多个指纹,因此,基于正则表达式的指纹进行分组得到的正则表达式组的数量较少,即正则表达式组编译成的DFA数量较少,即采用上述正则表达式匹配方法,不但能够提高正则表达式的匹配速度,还能够节省存储空间。
[0059]进一步的,正则表达式的指纹为预设长度的字符串,且该预设长度的字符串包含在能够和该正则表达式匹配的所有数据中,因此,上述步骤101确定正则表达式的指纹,具体可以包括:提取正则表达式的必经字符串,并截取预设长度的该必经字符串作为该正则表达式的指纹;该必经字符串为能够匹配上该正则表达式的数据中都包含的字符串。
[0060]上述提取正则表达式的必经字符串,具体可以包括:
[0061]当正则表达式中至少包含嵌套元字符时,若最外层嵌套元字符中不包含分支元字符,且最外层嵌套元字符后没有重复元字符,则提取删除该正则表达式的最外层嵌套元字符后的正则表达式的必经字符串,作为该正则表达式的必经字符串;
[0062]当正则表达式中至少包含嵌套元字符和分支元字符时,若任何嵌套元字符中均不包含分支元字符,或仅最外层嵌套元字符包含分支元字符,确定该正则表达式包括的不包含分支元字符的分支正则表达式;提取该分支正则表达式的必经字符串;确定该正则表达式的必经字符串为所有分支正则表达式的必经字符串中都包含的字符串;
[0063]当正则表达式中至少包含嵌套元字符、分支元字符和重复元字符时,若任何嵌套元字符中均不包含重复元字符,确定该正则表达式包括的不包含分支元字符的分支正则表达式;提取该分支正则表达式的必经字符串;确定该正则表达式的必经字符串为所有分支正则表达式的必经字符串;
[0064]其它情况不再 列举。
[0065]其中,分支正则表达式的必经字符串为能够匹配上该分支正则表达式的数据中都包含的字符串。
[0066]进一步的,步骤102根据正则表达式的指纹,确定该正则表达式的代表指纹,可以从该正则表达式的所有指纹中随机选择一个指纹作为该正则表达式的代表指纹。较佳的,可以将该正则表达式的指纹进行哈希,选择哈希冲突最小的指纹作为该正则表达式的代表指纹。
[0067]选择哈希冲突最小的指纹作为正则表达式的代表指纹,能够在正则表达式分组时,尽量避免哈希冲突,使代表指纹的哈希值相同的正则表达式尽量合并为一个正则表达式组,因此能够减少正则表达式组的数量,从而减少编译成的DFA的数量,提高正则表达式的匹配速度。
[0068]进一步的,步骤103根据正则表达式的代表指纹,确定正则表达式组,具体包括:根据该正则表达式的代表指纹的哈希值,将该正则表达式放入哈希槽中,并判断放入的哈希槽中是否已存在正则表达式;在放入的哈希槽中已存在正则表达式时,若该正则表达式的代表指纹和已存在正则表达式的代表指纹相同,则将该正则表达式和已存在正则表达式合并为一个正则表达式组。
[0069]较佳的,在合并之前,还可以考虑到正则表达式组编译成的DFA的大小,为避免编译成的DFA过大,具体可以在将该正则表达式和已存在正则表达式合并为一个正则表达式组之前,判断该正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量是否超过预设阈值;在该正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量不超过预设阈值时,才将该正则表达式和已存在正则表达式合并为一个正则表达式组。
[0070]由于正则表达式组编译成的DFA过大时不但会占用较大的存储空间,更会降低后续正则表达式匹配时的匹配速度,因此,采用在该正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量不超过预设阈值时,才将该正则表达式和已存在正则表达式合并为一个正则表达式组的方案,不但能够节省正则表达式组编译成的DFA占用的存储空间,更能够提高正则表达式的匹配速度。
[0071]较佳的,步骤103确定正则表达式组的代表指纹,具体包括:将该正则表达式组的指纹进行哈希,选择哈希值在所有正则表达式组的代表指纹的哈希值中出现次数最少的指纹作为该正则表达式组的代表指纹。
[0072]选择哈希值在所有正则表达式组的代表指纹的哈希值中出现次数最少的指纹作为该正则表达式组的代表指纹,即可以使各正则表达式组的代表指纹的哈希值尽量不同,使各正则表达式组尽量放入不同的哈希槽中,进行正则表达式的匹配时,能够提高配速度。
[0073]较佳的,在执行步骤104对待匹配数据进行正则表达式匹配之前,还可以对各正则表达式组进行合并调整,以进一步减少正则表达式组的数量,该合并调整步骤具体可以包括:
[0074]合并具有相同代表指纹的不同正则表达式组,合并后的正则表达式组的代表指纹为该相同代表指纹;
[0075]合并具有至少指定数量个相同指纹的不同正则表达式组,并确定该合并后的正则表达式组的代表指纹。
[0076]较佳的,在合并不同正则表达式组之前,也可以考虑到正则表达式组编译成的DFA的大小,具体可以在合并不同正则表达式组之前,判断合并后的正则表达式组编译成的DFA状态数量是否超过预设阈值;在合并后的正则表达式组编译成的DFA状态数量不超过预设阈值时,才将该不同正则表达式组合并为一个正则表达式组。
[0077]通过对符合条件的不同正则表达式组进行合并,可以进一步减少正则表达式组的数量,进而可以减少编译成的DFA的数量,因此,可以进一步提高正则表达式的匹配速度。
[0078]本发明实施例提供的正则表达式匹配方法可应用于深度包检测(De印packetinspection, DPI)、文本匹配、文档内容检索等领域。
[0079]即本发明实施例提供的正则表达式匹配方法需要先基于正则表达式的指纹对正则表达式进行分组,确定各正则表达式组后,将每个正则表达式组编译成一个DFA,建立正则表达式组的代表指纹与DFA的对应关系。
[0080]下面结合附图,用具体实施例对本发明提供的正则表达式匹配方案进行详细描述。
[0081]图2所示为本发明实施例提供的正则表达式匹配方法的详细流程图,具体包括:
[0082]步骤201、确定各正则表达式的所有指纹。
[0083]具体为先提取正则表达式的必经字符串,再截取预设长度的该必经字符串作为该正则表达式的指纹。
[0084]由于正则表达式的多样化,包含的情况较多,下面列举一些情况,结合具体例子说明如何确定正则表达式的指纹,在以下例子中,指纹的长度即预设长度具体为3。
[0085]例1:正则表达式“a(bcd)ef”,包含一层嵌套元字符“ O ”,这层嵌套元字符中不包含分支元字符“ I ”,且后面也没有重复元字符,故可以将嵌套元字符“ O ”删除后得到正则表达式“a(bcd)ef”的必经字符串“abcdef”,因此,正则表达式“a(bcd)ef”的指纹为“abc”、“bcd”、“cde” 和 “def”。
[0086]例2:正则表达式“abc+de”,包含重复元字符“ + ”,表示字符“c”重复一次或多次。在提取正则表达式“abc+de”的必经字符串时,可以将正则表达式“abc+de”拆分为两个分支正则表达式“abc”和“cde”,分支正则表达式“abc”的必经字符串即为“abc”,分支正则表达式“ cde ”的必经字符串即为“ cde ”,正则表达式“abc+de ”的必经字符串即为“abc ”和“ cde ”,因此,正则表达式“abc+de ”的指纹为“abc ”和“ cde ”。
[0087]例3:正则表达式“a (be)+f”,包含嵌套元字符“ O ”、重复元字符“ + ”,表示字符串“be”重复一次或多次。和例2类似,在提取正则表达式“a(bc)+f”的必经字符串时,可以将正则表达式“a (be) +f”拆分为两个分支正则表达式“a (be) ”和“ (be) f”。和例I类似,可以删去两个分支正则表达式中的嵌套元字符“ O ”,得到“abc”和“bef”,分支正则表达式"a (be) ”的必经字符串即为“abc”,分支正则表达式“(be) f ”的必经字符串即为“bef ”,正则表达式“a (be) +f ”的必经字符串即为“abc”和“bef ”,因此,正则表达式“a (be) +f ”的指纹为 “abc” 和 “bef”。
[0088]例4:正则表达式“aed(bc)*fac”,包含嵌套元字符“ O ”、重复元字符“*”,表示字符串“be”重复零次或多次。在提取正则表达式“aed(bc)*fac”的必经字符串时,可以将正则表达式“aed(bc)*fac”拆分为两个分支正则表达式“aed”和“fac”,分支正则表达式“aed”的必经字符串即为“aed”,分支正则表达式“fac”的必经字符串即为“fac”,正则表达式“aed (be) *fac ”的必经字符串即为“ aed”和“ fac ”,因此,正则表达式“aed (be) *fac ’,的指纹为“aed”和“fac”。
[0089]对于包含重复元字符“? ”以及包含重复元字符“ {,m} ”的正则表达式和例4类似,在此不再详述。
[0090]例5:正则表达式“ab{5,} C”,包含重复元字符“ {n,} ”,表示字符“b”重复至少五次。在提取正则表达式“ab {5,}c”的必经字符串时,可以将正则表达式“ab {5,}c”拆分为两个分支正则表达式“abbbbb”和“bbbbbc”,分支正则表达式“abbbbb”的必经字符串即为“abbbbb”,分支正则表达式“bbbbbc”的必经字符串即为“bbbbbc”,正则表达式“ab {5,} c”的必经字符串即为“abbbbb”和“bbbbbc”,因此,正则表达式“ab {5,} c”的指纹为“abb”、“bbb” 和 “bbc”。
[0091]上述例5中,若设置了必经字符串的长度阈值k,当n>k时,将前面的字符或子表达式重复k次即可。
[0092]对于包含重复元字符“ {n,m} ”的正则表达式和例5类似,在此不再详述。
[0093]例6:正则表达式“accdelaccbf”,包含分支元字符“|”。在提取正则表达式“accde Iaccbf ”的必经字符串时,可以将正则表达式“accde Iaccbf ”拆分为两个分支正则表达式“accde”和“accbf ”,分支正则表达式“accde”的必经字符串即为“accde”,分支正则表达式“accbf”的必经字符串即为“accde”,正则表达式“accde | accbf”的必经字符串为“accde”和“accde”中都包含的字符串,即“acc”,因此,“accde | accbf”的指纹为“acc”。
[0094]例7:正则表达式“abC[aeiou]fg”,包含元字符“ □”,表示匹配任何一个英文元音字母。在提取正则表达式“abC[aeiou]fg”的必经字符串时,可以将正则表达式“abc [aeiou] fg”拆分为两个分支正则表达式“abc”和“fg”,分支正则表达式“abc”的必经字符串即为“abc”,分支正则表达式“fg”的必经字符串即为“fg”,正则表达式“abC[aei0u]fg”的必经字符串为“abc”和“fg”中都包含的字符串,因此,正则表达式“abc [aeiou] fg”不存在指纹。
[0095]例8:正则表达式“ca(bcd|bed)f”,包含一层嵌套元字符“ O ”,在这一层嵌套元字符“ O ”中包含分支元字符“ I ”。在提取正则表达式“ca(bcd|bed)f”的必经字符串时,可以将正则表达式“ca (bed |bed) f”拆分为两个分支正则表达式“ca (bed) f”和“ca (bde)f”。和例I类似,可以删去两个分支正则表达式中的嵌套元字符“ O ”,得到“cabcdf”和“cabdef”。分支正则表达式“ca(bed) f”的必经字符串即为“cabcdf ”,分支正则表达式“ca(bde)f”的必经字符串即为“cabdef”,正则表达式“ca(bcd |bed) f”的必经字符串为“cabcdf ”和“ cabdef”中都包含的字符串,即“ cab ”,因此,正则表达式“ ca (bed | bed) f ”的指纹为“ cab ”。 [0096]例9:正则表达式“aab((ce) {2,3} d | cd)+bex”,包含两层嵌套元字符,并具有多种需要按不同情况处理的元字符。首先根据重复元字符“ + ”,将其拆分为两个分支正则表达式“ 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” 的必经字符串即为“aabcece ”,“ cece ”的必经字符串即为“ cece ”,“aab (ce) {2,3} ”的必经字符串即为“aabcece” 和 “cece” ;
[0099]上述“aabed”的必经字符串即为“aabed” ;
[0100]分支正则表达式“aab ((ce) {2,3} d| cd) ”的必经字符串为“aab (ce) {2,3}”的必经字符串和“aabed”的必经字符串中都包含的字符串,即“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” 的必经字符串即为“ cece ”,“ cecedbex”的必经字符串即为“ cecedbex”,“ (ce) {2,3} dbex”的必经字符串即为 “cece” 和 “cecedbex” ;
[0103]上述“cdbex”的必经字符串即为“cdbex” ;
[0104]分支正则表达式“((ce) {2,3}d|cd)bex”的必经字符串为“(ce) {2,3}dbex”的必经字符串和“cdbex”的必经字符串中都包含的字符串,即“dbex” ;
[0105]正则表达式“aab ((ce) {2,3} d | cd) +bex”的必经字符串为分支正则表达式“aab ((ce) {2,3} d | cd) ”和“ ((ce) {2,3} d | cd) bex”的所有必经字符串,SP“aabc”和“dbex”,因此,正则表达式 “aab ((ce) {2,3} d | cd) +bex” 的指纹为 “aab”、“abc”、“bde” 和 “bex”。
[0106]上述正则表达式拆分后的分支正则表达式并不一定跟原始的正则表达式有完全相同的语义,只要分支正则表达式能涵括所有必经字符串即可。
[0107]步骤202、确定各正则表达式的代表指纹。
[0108]具体可以将正则表达式的各指纹进行哈希,选择和其它正则表达式的代表指纹哈希冲突最小的指纹作为该正则表达式的代表指纹。
[0109]步骤203、对正则表达式进行预分组,将具有相同代表指纹的正则表达式分为一个正则表达式组。
[0110]较佳的,可以在正则表达式组编译成的DFA的状态的数量不超过预设阈值的前提条件下,对正则表达式进行预分组。[0111]得到的正则表达式组中的各个正则表达式具有的所有相同指纹为该正则表达式组的指纹。
[0112]在本发明实施例中,正则表达式的预分组具体可以在哈希表中实现,具体实现流程如图3所示,包括:
[0113]步骤301、将当前正在进行处理的正则表达式看作一个仅包含一个正则表达式的正则表达式组,当前正在进行处理的正则表达式的代表指纹作为该正则表达式组的预分组指纹。[0114]为便于区分,该正则表达式组下文中称为当前正则表达式组。
[0115]步骤302、判断该哈希槽中是否存在其它正则表达式组。
[0116]若确定该哈希槽中存在其它正则表达式组,则进入步骤303 ;若确定该哈希槽中不存在其它正则表达式组,则该哈希槽原为一个空槽,结束本次流程。
[0117]步骤303、判断该其它正则表达式组中是否存在预分组指纹和当前正则表达式组的预分组指纹相同的指定正则表达式组。
[0118]若确定该其它正则表达式组中存在预分组指纹和当前正则表达式组的预分组指纹相同的指定正则表达式组,则进入步骤304;若确定该其它正则表达式组中不存在预分组指纹和当前正则表达式组的预分组指纹相同的指定正则表达式组,则结束本次流程。
[0119]步骤304、判断当前正则表达式组和该指定正则表达式组合并后的正则表达式组编译成的DFA的状态的数量是否会超过预设阈值。
[0120]若确定当前正则表达式组和该指定正则表达式组合并后的正则表达式组编译成的DFA的状态的数量不会超过预设阈值,则进入步骤305,若确定当前正则表达式组和该指定正则表达式组合并后的正则表达式组编译成的DFA的状态的数量会超过预设阈值,则结束本次流程。
[0121]步骤305、将当前正则表达式组和该指定正则表达式组进行合并,合并后的正则表达式组的预分组指纹为当前正则表达式组和该指定正则表达式组具有的相同的预分组指纹。
[0122]下面用具体例子对上述预分组流程进行说明:
[0123]假设对10个正则表达式rl、r2……rlO进行预分组,经过步骤201确定的各正则表达式rl、r2......rlO的指纹如下表所示:
[0124]
正则表达式指纹
rlabc, efg
r2abc, efg
r3Imn,opq
r4Imn, opq
r5abc,hij
【权利要求】
1.一种正则表达式匹配方法,其特征在于,包括: 确定正则表达式的指纹; 根据所述正则表达式的指纹,确定所述正则表达式的代表指纹; 根据所述正则表达式的代表指纹,确定正则表达式组,并确定所述正则表达式组的代表指纹; 基于所述正则表达式组的代表指纹与所述正则表达式组编译成的确定有限状态自动机DFA的对应关系,对待匹配数据进行正则表达式匹配。
2.根据权利要求1所述的方法,其特征在于,所述确定正则表达式的指纹,具体包括: 提取正则表达式的必经字符串,并截取预设长度的所述必经字符串作为所述正则表达式的指纹;所述必经字符串为能够匹配上所述正则表达式的数据中都包含的字符串。
3.根据权利要求2所述的方法,其特征在于,所述提取正则表达式的必经字符串,具体包括: 当正则表达式中至少包含嵌套元字符时,若最外层嵌套元字符中不包含分支元字符,且最外层嵌套元字符后没有重复元字符,则提取删除所述正则表达式的最外层嵌套元字符后的正则表达式的必经字符串,作为所述正则表达式的必经字符串; 当正则表达式中至少包含嵌套元字符和分支元字符时,若任何嵌套元字符中均不包含分支元字符,或仅最外层嵌套元字符包含分支元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串中都包含的字符串; 当正则表达式中至少包含嵌套元字`符、分支元字符和重复元字符时,若任何嵌套元字符中均不包含重复元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串。
4.根据权利要求1至3任一所述的方法,其特征在于,所述根据所述正则表达式的指纹,确定所述正则表达式的代表指纹,具体包括: 将所述正则表达式的指纹进行哈希,选择哈希冲突最小的指纹作为所述正则表达式的代表指纹。
5.根据权利要求1至4任一所述的方法,其特征在于,所述根据所述正则表达式的代表指纹,确定正则表达式组,具体包括: 根据所述正则表达式的代表指纹的哈希值,将所述正则表达式放入哈希槽中,并判断放入的哈希槽中是否已存在正则表达式; 在放入的哈希槽中已存在正则表达式时,若所述正则表达式的代表指纹和已存在正则表达式的代表指纹相同,则将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
6.根据权利要求5所述的方法,其特征在于,所述将所述正则表达式和已存在正则表达式合并为一个正则表达式组之前,还包括: 判断所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量是否超过预设阈值; 所述将所述正则表达式和已存在正则表达式合并为一个正则表达式组,具体包括:在所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量不超过预设阈值时,将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
7.根据权利要求1至6任一所述的方法,其特征在于,所述确定所述正则表达式组的代表指纹,具体包括: 将所述正则表达式组的指纹进行哈希,选择哈希值在所有正则表达式组的代表指纹的哈希值中出现次数最少的指纹作为所述正则表达式组的代表指纹。
8.一种正则表达式匹配装置,其特征在于,包括: 第一确定单元,用于确定正则表达式的指纹; 第二确定单元,用于根据所述正则表达式的指纹,确定所述正则表达式的代表指纹; 第三确定单元,用于根据所述正则表达式的代表指纹,确定正则表达式组,并确定所述正则表达式组的代表指纹; 匹配单元,用于基于所述正则表达式组的代表指纹与所述正则表达式组编译成的确定有限状态自动机DFA的对应关系,对待匹配数据进行正则表达式匹配。
9.根据权利要求8所述的装置,其特征在于,所述第一确定单元,具体用于提取正则表达式的必经字符串,并截取预设长度的所述必经字符串作为所述正则表达式的指纹;所述必经字符串为能够匹配上所述正则表达式的数据中都包含的字符串。
10.根据权利要求9所述的装置,其特征在于,所述第一确定单元,具体用于当正则表达式中至少包含嵌套元字符时,若最外层嵌套元字符中不包含分支元字符,且最外层嵌套元字符后没有重复元字符,则提取删除所述正则表达式的最外层嵌套元字符后的正则表达式的必经字符串,作为所述正则表达式的必经字符串; 当正则表达式中至少包含嵌套元字符和分支元字符时,若任何嵌套元字符中均不包含分支元字符,或仅最外层嵌套元字符包含分支元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串中都包含的字符串; 当正则表达式中至少包含嵌套元字符、分支元字符和重复元字符时,若任何嵌套元字符中均不包含重复元字符,确定所述正则表达式包括的不包含分支元字符的分支正则表达式;提取所述分支正则表达式的必经字符串;确定所述正则表达式的必经字符串为所有分支正则表达式的必经字符串。
11.根据权利要求8至10任一所述的装置,其特征在于,所述第二确定单元,具体用于将所述正则表达式的指纹进行哈希,选择哈希冲突最小的指纹作为所述正则表达式的代表指纹。
12.根据权利要求8至11任一所述的装置,其特征在于,所述第三确定单元,具体用于根据所述正则表达式的代表指纹的哈希值,将所述正则表达式放入哈希槽中,并判断放入的哈希槽中是否已存在正则表达式;在放入的哈希槽中已存在正则表达式时,若所述正则表达式的代表指纹和已存在正则表达式的代表指纹相同,则将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
13.根据权利要求12所述的装置,其特征在于,所述第三确定单元,还用于将所述正则表达式和已存在正则表达式合并为一个正则表达式组之前,判断所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量是否超过预设阈值; 所述第三确定单元,具体用于在所述正则表达式和已存在正则表达式合并为一个正则表达式组后编译成的DFA状态数量不超过预设阈值时,将所述正则表达式和已存在正则表达式合并为一个正则表达式组。
14.根据权利要求8至13任一所述的装置,其特征在于,所述第三确定单元,具体用于将所述正则表达式组的指纹进行哈希,选择哈希值在所有正则表达式组的代表指纹的哈希值中出现次数最少的指纹作为所述正则表达式组的代表指纹。
【文档编号】G06F17/30GK103617226SQ201310603980
【公开日】2014年3月5日 申请日期:2013年11月25日 优先权日:2013年11月25日
【发明者】王宇平, 王雨濛 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1