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

文档序号:6338125阅读:181来源:国知局
专利名称:一种正则表达式匹配的方法及装置的制作方法
技术领域
本发明涉及数据处理领域,具体地涉及一种正则表达式匹配的方法及装置。
背景技术
正则表达式(Regular Expression)是一种用来描述特定字符串的工具。其语法 丰富,可以准确而灵活地描述各种复杂特征的字符串。正则表达式引擎则可以根据正则表 达式描述的特征,从给定的字符串集合中找出符合该特征的字符串子集。正则表达式引擎有非常广泛的用途,例如文本的查找替换,文件检索等。完成特定 内容识别过滤,网络监听,协议识别,流量侦测和流量控制,攻击防护,病毒检测,定向广告 推送等功能。通常可以把正则表达式编译生成NFA(Nondeterministic Finite Automaton,非 确定性有限自动机)或DFA (Deterministic Finite Automaton,确定性有限自动机),再用 软件或硬件实现NFA引擎,然后用这个NFA引擎根据前面编译出来的NFA数据去查找待匹 配的报文。发明人在实现本发明的过程中发现,现有技术至少存在以下不足NFA引擎以正则表达式为主导,查找时需要回溯,所以它可能多次取同一数据跟正 则表达式的不同部分比较。因此,在需要回溯的情况下它的执行速度可能非常慢。因为DFA表在规则比较复杂时(比如有多个.*)的情况,其中.表示任意字符,* 表示出现任意次数,该DFA表项比较大,占用大量的储存空间,所以DFA引擎在处理这种DFA 表时匹配速度也会比较慢。大量的正则表达式一起编译,储存空间会达到GB级别。

发明内容
本发明实施例提供一种正则表达式匹配方法及装置,以获得更快的匹配速度,并 降低DFA表项所占用的存储空间。一方面,本发明实施例提供了一种正则表达式匹配的方法,包括输入待匹配报文 及确定性有限自动机DFA状态表,所述DFA状态表包括状态迁移表,所述状态迁移表中包括 正则表达式匹配过程中的所有状态地址和各个状态之间的迁移关系,所述迁移关系包括匹 配条件及符合匹配条件的下一状态;判断当前状态对应的数据类型,所述数据类型包括单 个字符Char型和多个字符Str型,所述Str型对应的数据为连续的多个字符;如果当前状 态对应的数据类型是Str型,则将待匹配报文中当前状态的多个字符值与匹配条件进行匹 配处理,当匹配时,迁移至所述符合匹配条件的下一状态;如果当前状态对应的数据类型是 Char型,则将待匹配报文中当前状态的单个字符值与匹配条件进行匹配处理,当匹配时,迁 移至所述符合匹配条件的下一状态;当所述下一状态为接受态时,结束匹配过程并输出匹 配成功结果。另一方面,本发明实施例提供了一种正则表达式匹配的装置,包括报文及DFA表 载入单元,用于输入待匹配报文及确定性有限自动机DFA状态表,所述DFA状态表包括状态CN 102142009 A
说明书
2/14 页
迁移表,所述状态迁移表中包括正则表达式匹配过程中的所有状态地址和各个状态之间的 迁移关系,所述迁移关系包括匹配条件及符合匹配条件的下一状态;查找单元,包括数据类 型确定模块、匹配模块及输出模块;所述数据类型确定模块,用于判断当前状态对应的数据 类型,所述数据类型包括单个字符Char型和多个字符Str型,所述Str型对应的数据为连 续的多个字符;所述匹配模块,用于如果当前状态对应的数据类型是Str型,则将待匹配报 文中当前状态的多个字符值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条 件的下一状态;如果当前状态对应的数据类型是Char型,则将待匹配报文中当前状态的单 个字符值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态;所述 输出模块,用于当所述下一状态为接受态时,结束匹配过程并输出匹配成功结果。本发明实施例的有益效果在于本发明实施例提供的正则表达式的匹配方法,通 过将待匹配数据的数据类型分为Char型和Str型,并根据不同的数据类型分别执行不同的 匹配处理过程。对于Str型数据,是当该Str型所包含的多个字符全部匹配成功后才迁移 到下一状态,从而节省了迁移边,使状态迁移表需要记录的状态减少,可以极大地减小状态 迁移表所占用的储存空间,并提高匹配速度与匹配效率。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图做一简单地介绍,显而易见地,下面描述中的附图仅仅是 本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还 可以根据这些附图获得其他的附图。图1为本发明实施例1的正则表达式匹配方法的整体流程图;图IA为本发明实施例1作为一个举例的编译成DFA表后各个状态间的关系示意 图;图2为本发明实施例1的作为一个举例的字符映射表的数据结构示意图;图3为本发明实施例1的一种状态属性表的结构示意图;图4为本发明实施例1的状态迁移表的结构示意图;图4A为本发明实施例1图4的状态迁移表中Str型属性数据结构的示意图;图4B为本发明实施例1图4的状态迁移表中Rep型属性数据结构的示意图;图5为本发明实施例1作为又一个举例的字符映射表的结构示意图;图6为本发明实施例1作为举例的一个状态属性表的示意图;图7为本发明实施例1的作为一个举例的状态迁移表的示意图;图8为本发明实施例2的正则表达式匹配装置的功能框图;图9为本发明实施例2的图8所示正则表达式匹配装置的工作流程图;图10为本发明实施例2的图8所示的查找单元的详细工作流程图。
具体实施例方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例 中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是 本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。需要说明的是,由于本发明实施例使用的DFA表是一种由正则表达式编译出来的 二进制数据,所以可以查找的数据包括所有可以用二进制表示的内容,例如纯粹的二进制 ^iiS ^HfW^ !^ ^ (American Standard Code for Information Interchange, ASCII),统一码(UNICODE)等等。而这些格式的数据都可能出现在现有的报文里面,为了简 化起见,以下将待查找或匹配的数据简称为报文。而一个字节的二进制数据总能用一个等 效的字符表示(不管是否可打印字符),所以本发明实施例中把待查找数据中的单字节数 据简称为字符,多个单字节数据组合在一起称为字符串。实施例1 本发明实施例1提供了一种正则表达式匹配的方法。图1为本发明实施例1的正 则表达式匹配方法的整体流程图。如图1所示,该方法的执行主体是本发明实施例提供的 一种正则表达式匹配装置,该方法包括如下步骤步骤100、载入待匹配报文及确定性有限自动机DFA状态表,该DFA状态表包括状 态迁移表,该状态迁移表中包括正则表达式匹配过程中的所有状态地址和各个状态之间的 迁移关系,上述迁移关系包括匹配条件及符合匹配条件的下一状态。上述的地址是指某个 状态所对应的数据在存储介质,例如缓存,中储存的起始位置。步骤102、判断当前状态对应的数据类型,数据类型包括单个字符型(character 型,简称为Char型)和多个字符型(string型,简称为Str型),Str型对应的数据为连续 的多个字符。如果为Str型,执行步骤104,如果为Char型,执行步骤106。具体地,以下举例说明Char型和Str型。例如,对于正则表达式/teSt\S*abC/ (两个“/”之间的部分表示正则表达式,以下同),第一个字符t总是分类为Char型,est为 连续出现的多个字符,分类为Str型,通配符“\s*”表示“空格”、“回车”、“下一行”出现一 次、一次以上的任意次数或者不出现,即出现的次数不确定,则将位于报文中间的出现次数 不确定的单个字符分类为Char型,abc为连续出现且不重复的多个字符,分类为Str型。步骤104、如果当前状态对应的数据类型是Str型,则将待匹配报文中当前状态的 多个字符值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态。步骤106、如果当前状态对应的数据类型是Char型,则将待匹配报文中当前状态 的单个字符值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态。步骤108、当所述下一状态为接受态时,结束匹配过程并输出匹配成功结果。以下对本发明实施例中的“当前状态”和“下一状态”进一步进行详细说明。为了 便于理解,直接使用字符作为迁移条件,此外,以下将本发明实施例的正则表达式匹配装置 简称为引擎。例如正则表达式厂AB/,表示的匹配条件是待匹配数据的第一个字节必须是大 写字母A,第二个字节是大写字母B,才能匹配成功;否则匹配失败。编译成DFA表后各个状态间的关系如图IA所示。其中圆圈表示状态号,箭头表示 状态迁移,箭头边的字符表示迁移条件。图IA中,一共有0 3四个状态,其中状态3是接受态,状态0是失败态。状态1 和状态2是中间态。引擎开始工作时,状态号初始化为1。初始状态(状态1)对应的迁移关系数据必须储存在确定的空间,为了方便,一般储存在起始地址为1的储存空间。这时,则称状态1为 “当前状态”,引擎从待匹配数据里面取第一个字节,根据状态1所在的起始地址从状态迁移 表取出状态1的迁移关系数据,然后引擎比较并判断待匹配数据的第一个字节是“A”还是 “非A”。如果是“A”,则得知将迁移到状态2(实际得到的是状态2的迁移关系数据所在的 起始地址),这时状态2称为“下一状态”;如果是“非A”,则得知将迁移到状态0(实际得到 的也是状态0的迁移关系数据所在的起始地址,由于是失败态,引擎不需要实际迁移到这 个状态),这时状态0称为“下一状态”。接着引擎“迁移到”状态2,状态2称为“当前状态”。这时候再取待匹配数据的第 二个字节,并根据状态2所在的起始地址从状态迁移表取出状态2的迁移关系数据,然后引 擎比较并判断待匹配数据的第一个字节是“B”还是“非B”。如果是“B”,则得知将迁移到 状态3 (实际得到的是状态3的迁移关系数据所在的起始地址,由于是个接受态,引擎不需 要实际迁移到这个状态),这时状态3称为“下一状态”;如果是“非A”,则得知将迁移到状 态0 (实际得到的也是状态0的迁移关系数据所在的起始地址,由于是失败态,引擎不需要 实际迁移到这个状态),这时状态0称为“下一状态”。总之根据“某个状态”对应的迁移关系数据来对“待匹配数据”进行比较并确定 将迁移到“另一个状态”,则“某个状态”称为“当前状态”,得出的“另一个状态”称为“下一 状态”。值得指出的是,如果是“当前状态”刚好是一个循环的状态,则“下一状态”会等于 “当前状态”。本发明实施例图1所示方法,通过将待匹配数据的数据类型分为Char型和Str 型,并根据不同的数据类型分别执行不同的匹配处理过程。对于Str型数据,是当该Str型 所包含的多个字符全部匹配成功后才迁移到下一状态,从而节省了迁移边,使状态迁移表 需要记录的状态减少,可以极大地减小状态迁移表所占用的储存空间,并提高匹配速度与 匹配效率。进一步地,在本发明实施例的一较佳实施方式中,DFA状态表中还包括字符映射 表,该字符映射表中包括字符值与映射值之间的映射关系。在该映射关系中,可以将一个或 多个字符值与一个映射值建立映射关系,或者,将一类相同类型的字符映射成一个映射值。图2为本发明实施例的作为一个举例的字符映射表的数据结构示意图。如图2所 示,字符映射表保存报文字符与字符映射值之间的映射关系。图2示例性给出的字符值与 映射之间的映射关系包括将ASCII码值为0-96、100、102-255的多个字符值映射成映射值 OJfASCII码值为97-98的多个字符值映射成映射值UfASCII码值为99的字符值映射 成映射值2,将ASCII码值为101的字符值映射为3。当然,对应于不同的DFA表,可以采用 不同的字符映射表。图1中步骤106的处理过程具体可以包括如下步骤将待匹配报文中 当前状态的单个字符值的映射值与匹配条件进行匹配处理。此外,字符映射表还可以把一类相同类型的字符映射为一个映射值。举例如下规 则/a\s ? [a-z]+/表示的是字母a后面跟着0个或多个空格,其后再跟着一个或多个小写 字母。生成字符映射表时,会把字符a映射成一个值(例如1);空格对应的字符映射成另 一个值(例如2);字母a至ζ之间的字母映射成又一个值(例如3);不属于前面三种情况 的字符都映射成另一个值(例如0)。DFA状态表在从一个状态迁移到另一个状态时,可能会有多个不同的迁移边(即迁移所对应的字符)。如果把每个迁移边都分别记录,则表项数据会很大,不方便硬件实 现。所以本发明实施例较佳地采用了字符映射的方法,利用字符映射表将字符做一次映射, 并把这些有相同迁移方向的迁移边(字符)映射到同一个映射值上去。然后用映射值代替 字符作为迁移边,并记录在状态迁移表中,同时记录字符映射表。这样可以极大地减小状态 迁移表所占用的储存空间。例如/[a-ζ]/,如果在迁移表中直接用字符作为迁移边,则要记 录a ζ共沈种迁移情况;而使用字符映射表之后,把a ζ都映射成同一个映射值,并 用这个映射值作为迁移边,则只需要记录一个迁移边,有利于缩小DFA状态表项。需要说明 的是,术语“字符”不仅限于ASCII码字符,ASCII码外的格式也支持,例如中文字符,日文, TLV(Tag Length Value,标签,长度,数值)等格式。进一步地,在本发明实施例的另一较佳实施方式中,对数据类型进一步进行了细 分,增加了一种数据类型重复字符Rep型,该Rep型对应的数据为连续出现多次的属于一 定范围内的多个字符。以下举例详细说明Rep型数据。例如在正则表达式/teSt\S*W-9] {5}/中,第一个字符t总是分类为单个字符 Char型,\s*表示任意个数的空格,也分类为单个字符型,est分类为多个字符Str型,
{5}表示0至9之间的数字连续出现5次,则分类为重复字符R印型。又例如/tel :
{3}-
{8} [a-z] {100}/,第一个字符t和-都编译成单个字符Char型,通配符“- ”, 表示?出现的次数为0次或者1次,el 这三个字符则编译成多个字符Mr型,
{3}、
{8}和[a-z] {100}则编译成重复字符Rep型。进一步地,在本发明实施例的又一较佳实施方式中,在DFA状态表中增加了状态 属性表,根据该状态属性表可以更好地区分上述三种数据类型,特别是在正则表达式较为 复杂的情况下。图3为本发明实施例的状态属性表的结构示意图。如图3所示,各个数据域 的定义分别为第一地址阈值当状态地址大于或等于时,表示该状态属 于Str型数据;第二地址阈值R印Jiiin 当状态地址大于或者等于R印_min且小于Mr_min 时,表示该状态属于Rep型数据;另外,如果状态地址小于R印_min,则表示当前状态对应的 数据类型是Char型;Lower 输入字符大小写转换标记,举例来说,为1表示不区分大小写, 在做数据比较时,可以统一转为小写值进行比较。需要说明的是,各字段长度(比特数)可 根据正则表达式的规则复杂度进行灵活设置。状态属性表包含了 DFA状态表相关的参数信 息,可以用于确定状态迁移表中的数据处理类型及大小写是否敏感。需要说明的是,在图2和图3给出的较佳实施例中,DFA状态表是由正则表达式 DFA表编译器生成,该编译器会对正则表达式分析编译出来的原始DFA状态表做进一步分 析,生成三个子表状态属性表、字符映射表和状态迁移表。本发明实施例中的正则表达式 匹配装置从正则表达式DFA表编译器中获得上述三个子表。具体地,为了简化正则表达式 匹配装置的处理流程,进一步压缩状态迁移表所占用的储存空间,上述编译器将状态迁移 表数据分成上述三种类型=Char型、Str型、R印型(只区分数据类型,不拆分表项)。以下对本发明的一较佳实施例中DFA表包含的状态迁移表进行更为详细的说明。图4为本发明实施例1的状态迁移表的结构示意图。虽然图4仅示出了一行地 址,但实际情况下图4中的地址也可以分成多行。如图4所示,状态迁移表保存的是DFA 的每个状态在输入某个/某些字符时可以迁移到的下一个状态的地址,以及该状态的Itep/ Str属性数据。如果该状态无Rep/Str属性,则该迁移数据不含Rep/Str属性数据域,只有NextstJ) Nextst_n。其中,NextSt_0,-,NextSt_n表示状态机接收字符映射值为0,…, η的字符对应的下一个迁移状态地址,映射值较佳地为连续的数字,有利于节省存储DFA表 的空间。例如,假设映射值设置为0、1、2,上述映射值在存储空间中连续依次存储,只需要三 个存储位置;而如果映射值取不连续的1、3、5,则上述映射值在存储空间中相应的是间隔 存储,中间会额外多占用2个空余的存储位置,一共占用5个存储位置,这样就会浪费存储 空间,而且采用不连续的映射值还可能需要增加相应的解析算法,导致处理复杂度增加,而 采用连续的映射值既可以节省存储空间还可使处理算法的复杂度降低。以下配合图4Α和图4Β对Str型的数据和Rep型的数据分别进行详细说明。图4Α为本发明实施例1的Str型属性数据结构的示意图。如图4Α所示,Str型的 数据表示该状态是多个字符型状态,需要匹配字符串后进行状态迁移。若匹配过程中失败, 则从失败处取该字符的映射值按照状态迁移表进行迁移。数据说明如下=StrExitM字段 字符串匹配完毕后的迁移至下一状态的地址;StrLen 字符串占用字符个数nl,其中,nl为 正整数;String 字符串的字符值。需要说明的是,各字段长度(比特数)可根据正则表达 式的规则复杂度进行灵活设置。图4B为本发明实施例1的R印型属性数据结构的示意图。如图4B所示,对于R印 型的数据,在匹配时判断一类字符的重复次数,计数达到预定次数次后迁移到指定状态,中 途若失败则按照状态迁移表进行状态迁移。数据说明=RepExitM字段该Rep型数据匹配 成功后迁移至下一状态的地址;Count字段相同类型字符的重复次数π2,其中,η2为正整 数。Mask字段Rep型数据的字符集合映射值的掩码,用来表示当前字符的映射值是否在预 定范围之内,若是,则进行计数器,直到达到预定计数值。上述掩码值由本发明实施例的正 则表达式匹配装置从正则表达式DFA表编译器处获得。以下通过举例来说明MASK值的生 成方法或规则。假设R印型数据[A-C] {5},其表示A-C范围内的字符重复出现5次,再假设 字符映射表中将A、B、C分别一一映射为映射值0、1、2,当然根据字符映射表的设置,可以将 多个字符映射成一个映射值,然后,根据映射值将Mask字段中与映射值对应的比特位置1, 即将mask值的bit0、bitl、bit2均置为1,这样就得到了 mask值为0x07。在上述处理过程 可以看出,本发明实施例是用一个bit位来代替一个映射值,mask值是由上述映射值所构 成,这种处理方法进一步地降低了映射值所占的存储空间。以下举例说明如何根据mask值来确定映射值是否为有效范围内的映射值的处理 过程例如,mask值为0x09,即二进制的1001,bit3和bitO有效(为1),则表示映射值为 0和3的字符为预定范围内的字符,而bitl和bit2所对应的映射值1、2不是有效的映射 值,其所对应的字符并非预定范围内的字符。又例如mask值为0x7,即二进制的lll,bit2、 bitl和bitO都有效(为1),则表示映射值为0、1和2的字符为预定范围内的字符。在匹配处理的过程中,对于不同的数据类型,分别按照以下方式进行匹配处理。一种情况,如果状态迁移表中保存的匹配条件及符合匹配条件的下一状态包括 Char型数据匹配条件以及符合Char型数据匹配条件的下一状态;其中,Char型数据匹配 条件包括预先配置的Char型数据的映射值,符合匹配条件的下一状态是对应于预先配置 的Char型数据的映射值和当前状态的状态号的下一状态的地址。这种情况下的处理过程 是如果当前状态对应的数据类型是Char型,则将待匹配报文中当前状态的单个字符值对 应的映射值与预先配置的Char型数据的映射值进行比较,如一致,则根据当前状态的状态
10号和当前状态的映射值,查询所述状态迁移表以获得下一状态的地址,并迁移到下一状态。另一种情况,如果状态迁移表中保存的匹配条件及符合匹配条件的迁移地址还进 一步包括Str型数据匹配条件以及符合Str型数据匹配条件的下一状态;其中,Str型数据 匹配条件包括存储于MrLen字段中的预设字符个数nl,其中,nl为正整数;以及存储于 Mring字段中的预设的nl个字符各自的字符值;所述符合匹配条件的下一状态包括存储 于MrExitM字段中的Str型数据匹配成后迁移至下一状态的地址。在这种情况下,对于 Str型数据的处理过程包括将待匹配报文中当前状态的nl个字符值,与Mring字段存储 的nl个字符值依次进行比较,当全部相等时,根据MrExitM字段指示的下一状态的地址 迁移到下一状态。还一种情况,如果状态迁移表中保存的匹配条件及符合匹配条件的迁移地址还进 一步包括R印型数据匹配条件以及符合R印型数据匹配条件的下一状态;其中,所述R印 型数据匹配条件包括存储于Count字段中的重复次数π2,其中,n2为正整数;以及存储于 Mask字段中的掩码;所述符合R印型数据匹配条件的下一状态存储于R印ExitM字段中 的指示R印型数据匹配成功后迁移至下一状态的地址。在这种情况下,对于R印型数据的 处理过程包括如果当前状态对应的数据类型是Rep型,将待匹配报文中n2个字符分别对 应的映射值与Mask字段中的掩码进行比较,当π2个字符各自对应的映射值全部在所述掩 码范围内时,根据所述R印ExitM字段指示的下一状态的地址迁移到下一状态。又一种情况,如果状态迁移表中保存的匹配条件及符合匹配条件的迁移地址包括 上述三种类型时,其处理过程可将上述三种处理方法结合。可选地,图1所示方法还可以进一步包括步骤如果在Str型数据或者R印型数据 的匹配过程中发生不匹配的情形,则获取该不匹配的字符对应的映射值,根据映射值和当 前状态的状态号,查询状态迁移表得出下一状态地址,并迁移到下一状态。可选地,图1所 示方法还可以进一步包括如下步骤当下一状态为失败态时,结束匹配过程并输出匹配失 败结果;或者,当下一状态既不是接受态也不是失败态,并且当前匹配的字符是待匹配报文 的最后一个字符时,结束匹配过程并输出匹配失败结果。具体地,判断下一状态是何种状态 可依据下列处理步骤当下一状态的地址大于或等于预设的接受态地址阈值时,确定下一 状态为接受态;当下一状态的地址大于预设的失败态地址阈值且小于预设的接受态地址阈 值时,确定下一状态为中间态;当下一状态的地址等于预设的失败态地址阈值时,确定下一 状态为失败态。此外,可选的,在采用地址阈值区分中间态和接受态,并且也采用地址阈值 区分Str型、Char型和Itep型数据时,可以将中间态的地址阈值再分为Str型、Char型和 Rep型数据三段地址阈值,失败态和接受态可以不区分数据类型,当下一状态为接受态但还 有字符需要匹配时,可以跳转到相应的中间态继续进行匹配过程。本领域普通技术人员可 以理解,采用地址阈值区分数据类型和状态类型仅仅是本发明的一种具体实现方式,此外 也可以直接将数据类型和状态类型写在DFA状态表中,或者另外单独维护数据类型和状态 类型,对于数据类型还可以直接采取默示的方式,即当DFA状态表的相应表项中有Char型 或Rep型数据时优先尝试匹配Char型或R印型数据。可选地,在图1所示方法中,可以将待匹配报文的第一个字符处理为Char型数据。以下对本发明实施例的方法达到的提高匹配速度的优点进行详细说明。本发明实施例采用了字符映射的方法,把在某个当前状态下,迁移到某个下一状态的多个作为迁移条件的字符映射为一个单一的映射值,而且不同状态之间的迁移条件相 同时,可以共用一个映射值。通过减少迁移边,在正则表达式比较复杂的情况下可以减少了 状态迁移表所占的储存空间。例如,在状态迁移表的空间远远大于字符映射表的情况下,所 增加的字符是映射表的空间较小,其所增加的存储空间相比于其所能节省的存储空间小得 多,这样就达到了减少状态迁移表所占储存空间的目的。另外,本发明实施例还将状态迁移表数据分为Char型、Str型和R印型数据。Char 型数据用映射值确定作为迁移条件,可以节省储存空间。Str型数据把通常技术中的DFA表 中一长串字符合成一个迁移条件,原始DFA表中这一长串字符对应的多个状态也就合成一 个状态,这样可以明显减少迁移关系数据所占的储存空间。另外正如前面对图IA中所述, 状态发生迁移时,需要重新计算状态迁移表的访问地址,并根据这个新的地址从状态迁移 表取出新的匹配条件才能进行比较和判断,所以减少状态的数量也就是减少了引擎做状态 迁移所需的的时间,提高了匹配的速度。Rep数据把多个相同的迁移条件的状态合并成一个 状态,减少了状态迁移所需的时间,提高了匹配速度;本发明实施例还使用了映射值构成的 掩码(mask),使用映射值以及采用掩码来表示映射值的方法可以减少迁移条件所占的储存 空间。DFA表所占的储存空间小,则引擎可以用更小的数据位宽。而在其他条件相同的情 况下,数据位宽小的装置能比数据位宽大的装置运行速度更快,效率更高。进一步地,以下以正则表达式厂test
{5}/si为例,进一步详细说明本发明 实施例1的正则表达式匹配方法。需要注意的是,实际情况下DFA编译器可能同时编译多 个正则表达式,以下是为了描述方便仅说明了其中一条正则表达式。图5为本发明实施例1的作为又一个举例的字符映射表的结构示意图。编译时, 依据图5所示的字符映射表,把
对应的ASCII码值映射为1,t (ASCII值为116)和 T(ASCII值为84)映射为2,其余字符映射为0。图6为本发明实施例1作为举例的一个状 态属性表的示意图,其中R印_min为0x2,Mr_min为0x5,Lower为0x1。根据图6可知,状 态所在的地址大于或者等于Ox 5则属于Mr类型的数据,状态所在的地址在大于等于Ox 2 且小于Ox 5则属于R印类型的数据,状态所在的地址小于Ox 2则为Char类型的数据。图7为本发明实施例1的状态迁移表的一个示例图,如图7所示,该状态迁移表中 一共含有3个状态。第一行的0,1,2表示映射值,state χ表示状态号,statel表示状态1, state2表示状态2,state3表示状态3。其中状态1是Char型的数据;状态2有Mask域, 是R印型数据,且状态2中Mask值为0x2,即二进制的10,bitl有效,bitO无效,表示当待 匹配字符的映射值为1时在该Mask值的范围之内,Count字段取值为5,表示重复次数为5 次,且R印ExitM字段的指示的地址是预先配置的0x01F8 ;状态3有string域,是Str型 数据,字符长度为3个,Mring字段中存储了用于匹配的0x65、0x73、0x74,分别对应于e、 s、t,且MrExitM字段的指示的地址是0x0002。假设输入的待查找匹配的报文为Testl23456789。正则表达式匹配装置开始查找 时,将当前状态(初始状态)置为1,statel的存储地址是0x0001。然后,读入字符T对 应的映射值,根据图5示出的映射表可知映射值为2。然后,根据映射值2查询当前状态 (statel)对应的状态迁移表,如图7所示,statel下映射值为2时对应的下一状态地址是 0x0005,而0x0005为state3的存储地址,于是从statel迁移到state3。然后,判断state3所对应的数据类型,由于state3的地址0x0005等于Mr_min,所以可知是Str类型的数 据。接着,依次读取待查找报文中的e,s, t,并跟状态迁移表中地址0x0005对应的string 字段存储的0X65:e,0X73:S,0X74:t进行比较,比较后发现三个字符都相等,于是迁移到 StrExitSt字段指示的迁移地址0x0002,即从state3迁移到state2。接着,判断state2的 数据类型,由于state2的地址0x0002处于Itepjnin (0x0002)和Mrjnin (0x0005)之间,则 确定状态2属于R印类型的数据,于是依次读入字符1,2,3,4,5的映射值,根据图5可知,字 符1-5的映射值都为1,而掩码Mask值为0x02,即bitl为l,bitl为有效位,所以1_5的映 射值在掩码Mask值的范围之内,满足循环5次的条件,得到Exit_st字段指示的地址OxlFS 作为下一个状态所在的地址,发现是一个接受态(大于或等于接受态阈值),于是整个正则 表达式匹配成功。假设输入的待查找匹配的报文为ffestl23456789。正则表达式匹配装置开始查找 时,将当前状态(初始状态)置为1,statel的存储地址是0x0001。然后,读入字符W对 应的映射值,根据图5示出的映射表可知映射值为0。然后,根据映射值0查询当前状态 (statel)对应的状态迁移表,得到下一状态的地址为0x0,于是迁移到下一状态,然后,判 断该下一状态为失败态,因此整个正则表达式匹配失败,输出匹配失败的结果。假设输入的待查找匹配的报文为Tbstl2345。正则表达式匹配装置开始查找时,将 当前状态(初始状态)置为1,statel的存储地址是0x0001。然后,读入字符T对应的映 射值,根据图5示出的映射表可知映射值为2。然后,根据映射值2查询当前状态(statel) 对应的状态迁移表,如图7所示,statel下映射值为2时对应的下一状态地址是0x0005,而 0x0005为state3的存储地址,于是从statel迁移到state3。然后,判断state3所对应的 数据类型,由于state3的地址0x0005等于Mr_min,所以可知是Str类型的数据。接着,依 次读取待查找报文中的b,s, t,并跟状态迁移表中地址0x0005对应的string字段存储的 0x65 e,0x73 s,0x74 t进行比较,发现待查找报文中的b与string字段存储的0x65 e不 相等,则不再比较后续字符,获取字符b的映射值,根据图5可知,字符b的映射值为0,查询 图7所示的状态迁移表可知,state3时映射值0对应的下一状态的地址为0x0,该地址为失 败态地址,于是整个正则表达式匹配失败,输出匹配失败的结果。假设输入的待查找匹配的报文为Testl234。对于Char型数据T和Str型数据est 的匹配过程与前面相同,以下只描述对R印型数据1234的匹配过程。判断state2的数据 类型,由于state2的地址0x0002处于Itepjnin (0x0002)和Mrjnin (0x0005)之间,则确定 状态2属于R印类型的数据,于是依次读入字符1,2,3,4的映射值,并逐个判断每一个映射 值是否在掩码Mask值的范围之内。根据图5可知,字符1-4的映射值都为1,而掩码Mask 值为0x02,即bitl为有效位,所以1-4的映射值在掩码Mask值的范围之内。但是,上述匹 配过程只循环了 4次,不满足循环5次的条件且已经到达待查找报文的结尾,于是整个正则 表达式匹配失败,输出匹配失败结果。本发明实施例1提供的正则表达式的匹配方法,通过用字符映射值来代替同一类 字符,有利于可以极大地减小状态迁移表所占用的储存空间。通过将待匹配报文分成单个 字符型、多个字符型重复字符型,并根据状态的存储地址来判断数据类型,以便采用不同的 处理类型或方式,以及根据状态的储存地址来判断当前的状态是接受态还是失败态,可以 加快匹配速度、提高运行效率,不需要回溯。
实施例2 本发明实施例2提供了一种正则表达式匹配装置。图8为本发明实施例2的正则 表达式匹配装置的功能框图。如图8所示,该装置200包括报文及DFA表载入单元210,用于输入待匹配报文及确定性有限自动机DFA状态 表,所述DFA状态表包括状态迁移表,所述状态迁移表中包括正则表达式匹配过程中的所 有状态地址和各个状态之间的迁移关系,所述迁移关系包括匹配条件及符合匹配条件的下 一状态;查找单元230,包括数据类型确定模块231、匹配模块232及输出模块234 ;数据类型确定模块231,用于判断当前状态对应的数据类型,所述数据类型包括单 个字符Char型和多个字符Str型,所述Str型对应的数据为连续的多个字符;匹配模块232,用于如果当前状态对应的数据类型是Str型,则将待匹配报文中当 前状态的多个字符值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下 一状态;如果当前状态对应的数据类型是Char型,则将待匹配报文中当前状态的单个字符 值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态;输出模块234,用于当所述下一状态为接受态时,结束匹配过程并输出匹配成功结^ ο可选地,DFA状态表还包括字符映射表,所述字符映射表中包括字符值与映射值之 间的映射关系;图8所示装置还可以进一步包括报文预处理单元220,用于根据上述字符 映射表对上述待匹配报文进行映射处理,生成一个或多个映射值。匹配模块232,还可以用于将待匹配报文中当前状态的单个字符值的映射值与匹 配条件进行匹配处理。可选地,数据类型还可以重复字符R印型,R印型对应的数据为连续出现多次的属 于一定范围内的多个字符。数据类型确定模块231,还可以用于判断当前状态对应的数据 类型,所述数据类型包括单个字符Char型、多个字符Str型和重复字符Rep型。匹配模块 232,还可以用于如果当前状态对应的数据类型是Rep型,则将待匹配报文中当前状态的映 射值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态。可选地,DFA状态表还包括状态属性表,状态属性表包括第一地址阈值Mrjnin和 第二地址阈值R印Jiiin ;数据类型确定模块231,具体可以用于如果当前状态的地址大于或 等于所述Mr_min,则确定当前状态对应的数据类型是Str型;如果当前状态的地址大于或 等于所述R印_min,并且小于所述Mr_min,则确定当前状态对应的数据类型是Rep型;或 者,如果当前状态的地址小于所述Itepjnin,则确定当前状态对应的数据类型是Char型。具体地,匹配条件包括预先配置的Char型数据的映射值,符合匹配条件的下一状 态是对应于所述预先配置的Char型数据的映射值和当前状态的状态号的下一状态的地 址;匹配模块232,具体可以用于如果当前状态对应的数据类型是Char型,则将待匹配报文 中当前状态的单个字符值对应的映射值与预先配置的Char型数据的映射值进行比较,如 一致,则根据当前状态的状态号和当前状态的映射值,查询状态迁移表以获得下一状态的 地址,并迁移到下一状态。可选地,上述匹配条件及符合匹配条件的下一状态包括Str型数据匹配条件以 及符合Str型数据匹配条件的下一状态;其中,Str型数据匹配条件包括存储于MrLen字段中的预设字符个数nl,其中,nl为正整数;以及存储于乂!^叫字段中的预设的nl个字符 各自的字符值;符合匹配条件的下一状态包括存储于StrExitM字段中的Str型数据匹 配成后迁移至下一状态的地址。匹配模块232,具体可以用于如果当前状态对应的数据类型 是Str型,将待匹配报文中当前状态的nl个字符值,与Mring字段存储的nl个字符值依 次进行比较,当全部相等时,根据StrExitM字段指示的下一状态的地址迁移到下一状态。可选地,上述匹配条件及符合匹配条件的下一状态包括R印型数据匹配条件以 及符合R印型数据匹配条件的下一状态;其中,述R印型数据匹配条件包括存储于Count 字段中的重复次数n2,其中,π2为正整数;以及存储于Mask字段中的掩码;符合Rep型数 据匹配条件的下一状态存储于R印ExitM字段中的指示R印型数据匹配成功后迁移至下 一状态的地址。匹配模块232,具体可以用于如果当前状态对应的数据类型是Rep型,将待 匹配报文中n2个字符分别对应的映射值与Mask字段中的掩码进行比较,当n2个字符各自 对应的映射值全部在所述掩码范围内时,根据所述R印ExiUt字段指示的下一状态的地址 迁移到下一状态。可选地,输出模块234,还用于当下一状态为失败态时,结束匹配过程并输出匹配 失败结果;或者,当下一状态既不是接受态也不是失败态,并且当前匹配的字符是待匹配报 文的最后一个字符时,结束匹配过程并输出匹配失败结果。可选地,查找单元230还可以进一步包括状态判断模块233,用于当下一状态的 地址大于或等于预设的接受态地址阈值时,确定下一状态为接受态;当下一状态的地址大 于预设的失败态地址阈值且小于预设的接受态地址阈值时,确定下一状态为中间态;当下 一状态的地址等于预设的失败态地址阈值时,确定下一状态为失败态。具体地,上述字符包括ASCII码字符或者UNICODE码字符等可以用二进制表示的 值。可选地,匹配模块232,还可以用于将待匹配报文的第一个字符处理为Char型数 据。可选地,报文及DFA表载入单元210还包含缓存,该缓存包括先进先出存储器FIFO 和随机存取存储器RAM,该FIFO用于存储状态属性表,该RAM用于存储字符映射表和状态迁 移表。可选地,图8所示装置还可以进一步包括缓存管理单元对0,用于判断和刷新缓 存的空满状态并反馈给报文及DFA表载入单元210。查找单元230查找结束后,通知缓存管 理单元240释放当前的缓存空间。缓存管理单元240根据当前缓存使用情况,把释放指示 转换成缓存空指示并传送给报文及DFA表载入单元210,报文及DFA表载入单元210便可以 载入新的报文及DFA表。需要说明的是,由于报文及DFA表载入单元210无法预知查找单元230需要获取 字符值还是映射值,所以本发明实施例2的正则表达式匹配装置设置了报文预处理单元 210,来将字符值和映射值同时准备好,以加快查找单元230的处理速度。报文预处理单220 元用于连续检测输入FIFO状态,在FIFO非空时读出参数值,然后逐字节读出报文并进行映 射处理,向查找单元130输出字符值和映射值。查找单元230在字符值和映射值准备好后, 取出报文数据或者映射值,结合当前所处的状态号,查找上述状态迁移表,...如此循环,直 到得到匹配结果。缓存管理单元M0,用于根据查找结果及缓存载入情况判断该缓存的空满状态,并把判断结果输出给报文及DFA表载入单元210。以下描述在一较佳实施例中,本发明实施例的正则表达式装置的工作过程。图9 为本发明实施例2的正则表达式匹配装置200的工作流程图。结合参阅图8和图9,包括如 下步骤步骤300 在内部缓存RAM非满时,载入需要查找的报文和相应的DFA表,本步骤 由图8中的报文及DFA表载入单元210完成。DFA表由需要匹配的正则表达式规则编译和 压缩而成。步骤302 报文预处理单元220根据报文和DFA表中的存储的字符映射表,获取报 文数据进行映射。具体做法是每次取一字节的的报文数据,然后查找字符映射表,得到的结 果作为该字节数据对应的映射值,并和这字节数据一起输出给查找单元230。步骤304 查找单元230根据当前状态所在的地址和状态属性表中的R印_min和 Mrjiiin值,确定当前匹配的字节属于哪种数据类型。根据不同的类型取用报文数据或者映 射值,结合当前状态号,查找报文及DFA表载入单元210中的状态迁移表,得到下一状态所 在地址。步骤306 查找单元230根据下一状态的储存地址判断是否为接受态。例如状态 地址为9bit时,我们把所在的地址大于或等于接受态阈值的状态判定为接收态。接受态的 地址范围可以根据实际需要来设定。状态机一旦跳到一个接受态,则认为当前报文与规则 匹配成功。如果下一状态不是接受态,则转到步骤310。步骤308 查找单元230输出匹配成功结果,并通知缓存管理单元240释放缓存。步骤310 下一状态不是接受态,查找单元230还需要判断下一状态是否为失败 态(即下一状态地址为0)。如是,则认为当前报文与规则匹配失败,进入步骤312;如否, 则转到步骤314。未查找完报文就知道不匹配的主要是一些指定报文头的规则,例如规则 厂test/,则只要报文的前四个字节不是test就认为匹配失败了。步骤312 查找单元230输出不匹配结果,也即输出匹配失败结果,并通知缓存管 理单元140释放缓存。步骤314 下一状态既不是接受态也不是失败态的,查找单元230还需要判断当前 字节是否为报文最后一个字节。如是,则认为当前报文与正则表达式规则不匹配,进入步骤 312 ;如否,则进入步骤302继续取报文下一字节进行比较。以下描述本发明实施例2图8中的查找单元230的工作流程。图10为本发明实施例2图8所示的查找单元的工作流程图。结合参阅图8和图 10,查找单元的工作流程包括如下步骤步骤400 判断报文预处理单元220的字符和映射值是否准备好。如是,则转到步 骤402,否则继续等待。步骤402 把当前状态设置为1(初始状态值),并从报文预处理单元220读入一字 节的报文数据和映射值。步骤404 每次查找开始的第一字节数据都按照Char型数据处理,根据把当前状 态的地址以及该字节数据对应的映射值,查找状态迁移表得到下一状态所在的地址。步骤406 根据下一状态所在的地址判断是否属于接受态。如是,则转到步骤424, 否则转到步骤408。例如状态地址为9bit时,我们把所在的地址大于或等于OxlFS的状态判定为接收态。状态机一旦跳到一个接受态,则认为当前报文与规则匹配成功。步骤408 根据下一状态所在的地址判断是否属于失败态。如是,则转到步骤426, 否则转到步骤410。当下一状态的状态地址为0时,判定下一状态为失败态。状态机一旦跳 到一个失败态,则认为当前报文与规则匹配失败。步骤410 下一状态既不是接受态也不是失败态,还需要判断当前字节是否报文 最后一个字节。如是,则认为当前报文与规则不匹配,转到步骤426 ;否则转到步骤412。步骤412 接着结合R印Jiiin和Mr_min判断下一状态的类型。如果下一状态所 在的地址大于等于R印Jiiin而小于则判断为R印型,并转到步骤416。否则转到步 骤 414。步骤414 如果大于等于Mrjnin则判断为Str型,转到步骤318。否则判断为char 型,转到步骤420。步骤416:当前数据属于R印型数据。用前面所得的下一状态地址,访问报文及DFA 表载入单元110中的状态迁移表,读出R印型属性数据,包括Exit_st,Count和Mask。然后 逐个字节读出报文的映射值,判断是否在Mask范围内,如在Mask范围内则计数值加1。计 数值等于Count的值时表示重复的字符全部匹配,取Exit_st作为下一状态地址,判断类型 后继续查找。当前类型的数据处理完之后,转到步骤422。此外,如果映射值不在Mask范围内时,则读取当前不匹配字符对应的映射值,根 据状态迁移表得到下一状态的地址,与接收态地址阈值和失败态地址阈值进行比较,在判 断阈值范围后进行下一步相应处理。步骤418:当前数据属于Str型数据。用前面所得的下一状态地址,访问报文及DFA 表载入单元210中的状态迁移表,读出Str型属性数据,包括Exit_St,Mr_len和String。 然后逐个字节读出报文字符值,与Mring中存储的数据进行比较,比较相等则计数值加1。 计数值等于时表示连续的字符全部匹配,取Exit_st作为下一状态地址,判断类型 后继续查找。当前类型的数据匹配处理完之后,转到步骤422。另外,如果字符比较时不相等,则读取当前不匹配的字符对应的映射值,根据状态 迁移表得到下一状态的地址,与接收态地址阈值和失败态地址阈值进行比较,在判断阈值 范围后进行下一步相应处理。步骤420 当前数据属于Char型数据。把查找状态迁移表得到的下一状态地址替 换成当前状态地址,重新读入一字节的字符映射值,转到步骤422。步骤422 从报文预处理单元220读入下一字节的报文数值和映射值,继续查找。步骤424 输出匹配成功的结果,并通知缓存管理单元240释放相应的缓存。步骤426 输出匹配失败的结果,并通知缓存管理单元240释放相应的缓存。本发明实施例2的有益效果在于1、本发明实施例提供的引擎在查找时不需要回溯,匹配速度快。2、对原始DFA数据进行了压缩和优化,使着结构简洁,占用更小的储存空间和更 小的逻辑资源或硬件资源,运行速度进一步加快,运行频率更高。3、硬件结构精简,容易实现多个正则表达式引擎并行工作来提高处理能力。尤其 适合10(ibpS以上的需求场景。4、与通用处理器或者网络处理器配合,可实现以下功能报文过滤、攻击防护、病毒检测、垃圾邮件过滤、协议检测、基于协议的流量监控、定向广告推送等。
尽管上面详细例阐述了本发明的实施示例,但是本领域的计数人员将会理解,只 要把本发明做一些细节上的调整,就可以用在其他形式的环境中,而并没有背离本发明的 精神和范围。例如,本发明实施例也可以在通用的计算机上用纯软件的方式实现;或者把需 要处理的表项内容储存在外部储存器中使用;或者一部分功能使用软件实现一部分使用硬 件实现,等等。
权利要求
1.一种正则表达式匹配的方法,其特征在于,所述方法包括输入待匹配报文及确定性有限自动机DFA状态表,所述DFA状态表包括状态迁移表,所 述状态迁移表中包括正则表达式匹配过程中的所有状态地址和各个状态之间的迁移关系, 所述迁移关系包括匹配条件及符合匹配条件的下一状态;判断当前状态对应的数据类型,所述数据类型包括单个字符Char型和多个字符Str 型,所述Str型对应的数据为连续的多个字符;如果当前状态对应的数据类型是Str型,则将待匹配报文中当前状态的多个字符值与 匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态;如果当前状态对应的数据类型是Char型,则将待匹配报文中当前状态的单个字符值 与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态;当所述下一状态为接受态时,结束匹配过程并输出匹配成功结果。
2.根据权利要求1所述的方法,其特征在于,所述DFA状态表还包括字符映射表,所述 字符映射表中包括字符值与映射值之间的映射关系;所述将待匹配报文中当前状态的单个字符值与匹配条件进行匹配处理,包括将待匹配 报文中当前状态的单个字符值的映射值与匹配条件进行匹配处理。
3.根据权利要求2所述的方法,其特征在于,所述数据类型还包括重复字符Rep型, 所述Rep型对应的数据为连续出现多次的属于一定范围内的多个字符;所述方法还包括判断当前状态对应的数据类型时,如果当前状态对应的数据类型是Rep型,则将待匹 配报文中当前状态的映射值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条 件的下一状态。
4.根据权利要求2所述的方法,其特征在于,所述匹配条件包括预先配置的Char型数 据的映射值,所述符合匹配条件的下一状态是对应于所述预先配置的Char型数据的映射 值和当前状态的状态号的下一状态的地址;所述将待匹配报文中当前状态的单个字符值的映射值与匹配条件进行匹配处理包括将待匹配报文中当前状态的单个字符值对应的映射值与预先配置的Char型数据的映 射值进行比较,如一致,则根据当前状态的状态号和当前状态的映射值,查询所述状态迁移 表以获得下一状态的地址,并迁移到下一状态。
5.根据权利要求1所述的方法,其特征在于,所述匹配条件及符合匹配条件的下一状 态包括Str型数据匹配条件以及符合Str型数据匹配条件的下一状态;其中,所述Str型 数据匹配条件包括存储于MrLen字段中的预设字符个数nl,其中,nl为正整数;以及存 储于Mring字段中的预设的nl个字符各自的字符值;所述符合匹配条件的下一状态包括 存储于MrExitM字段中的Str型数据匹配成后迁移至下一状态的地址;所述将待匹配报文中当前状态的多个字符值与匹配条件进行匹配处理,当匹配时,迁 移所述符合匹配条件的下一状态包括将待匹配报文中当前状态的nl个字符值,与Mring字段存储的nl个字符值依次进行 比较,当全部相等时,根据MrExitM字段指示的下一状态的地址迁移到下一状态。
6.根据权利要求3所述的方法,其特征在于,所述匹配条件及符合匹配条件的下一状 态包括R印型数据匹配条件以及符合R印型数据匹配条件的下一状态;其中,所述R印型数据匹配条件包括存储于Count字段中的重复次数π2,其中,η2为正整数;以及存储于 Mask字段中的掩码;所述符合R印型数据匹配条件的下一状态存储于R印ExitM字段中 的指示R印型数据匹配成功后迁移至下一状态的地址;所述将待匹配报文中当前状态的映射值与匹配条件进行匹配处理,当匹配时,迁移至 所述符合匹配条件的下一状态包括将待匹配报文中n2个字符分别对应的映射值与Mask字段中的掩码进行比较,当n2个 字符各自对应的映射值全部在所述掩码范围内时,根据所述R印ExiUt字段指示的下一状 态的地址迁移到下一状态。
7.一种正则表达式匹配的装置,其特征在于,所述装置包括报文及DFA表载入单元,用于输入待匹配报文及确定性有限自动机DFA状态表,所述 DFA状态表包括状态迁移表,所述状态迁移表中包括正则表达式匹配过程中的所有状态地 址和各个状态之间的迁移关系,所述迁移关系包括匹配条件及符合匹配条件的下一状态;查找单元,包括数据类型确定模块、匹配模块及输出模块;所述数据类型确定模块,用于判断当前状态对应的数据类型,所述数据类型包括单个 字符Char型和多个字符Str型,所述Str型对应的数据为连续的多个字符;所述匹配模块,用于如果当前状态对应的数据类型是Str型,则将待匹配报文中当前 状态的多个字符值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一 状态;如果当前状态对应的数据类型是Char型,则将待匹配报文中当前状态的单个字符值 与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状态;所述输出模块,用于当所述下一状态为接受态时,结束匹配过程并输出匹配成功结果。
8.根据权利要求7所述的装置,其特征在于,所述DFA状态表还包括字符映射表,所述 字符映射表中包括字符值与映射值之间的映射关系;所述装置还包括报文预处理单元,用于根据所述字符映射表对上述待匹配报文进行映射处理,生成映 射值;所述匹配模块,还用于将待匹配报文中当前状态的单个字符值的映射值与匹配条件进 行匹配处理。
9.根据权利要求8所述的装置,其特征在于,所述数据类型还包括重复字符Rep型, 所述Rep型对应的数据为连续出现多次的属于一定范围内的多个字符;所述数据类型确定模块,还用于判断当前状态对应的数据类型,所述数据类型包括单 个字符Char型、多个字符Str型和重复字符Rep型;所述匹配模块,还用于如果当前状态对应的数据类型是Rep型,则将待匹配报文中当 前状态的映射值与匹配条件进行匹配处理,当匹配时,迁移至所述符合匹配条件的下一状 态。
10.根据权利要求8所述的装置,其特征在于,所述匹配条件包括预先配置的Char型数 据的映射值,所述符合匹配条件的下一状态是对应于所述预先配置的Char型数据的映射 值和当前状态的状态号的下一状态的地址;所述匹配模块,具体用于将待匹配报文中当前状态的单个字符值对应的映射值与预先 配置的Char型数据的映射值进行比较,如一致,则根据当前状态的状态号和当前状态的映 射值,查询所述状态迁移表以获得下一状态的地址,并迁移到下一状态。
11.根据权利要求7所述的装置,其特征在于,所述匹配条件及符合匹配条件的下一状 态包括Str型数据匹配条件以及符合Str型数据匹配条件的下一状态;其中,所述Str型 数据匹配条件包括存储于MrLen字段中的预设字符个数nl,其中,nl为正整数;以及存 储于Mring字段中的预设的nl个字符各自的字符值;所述符合匹配条件的下一状态包括 存储于MrExitM字段中的Str型数据匹配成后迁移至下一状态的地址;所述匹配模块,具体用于将待匹配报文中当前状态的nl个字符值,与Mring字段存储 的nl个字符值依次进行比较,当全部相等时,根据StrExitM字段指示的下一状态的地址 迁移到下一状态。
12.根据权利要求9所述的装置,其特征在于,所述匹配条件及符合匹配条件的下一状 态包括R印型数据匹配条件以及符合R印型数据匹配条件的下一状态;其中,所述R印型 数据匹配条件包括存储于Count字段中的重复次数π2,其中,η2为正整数;以及存储于 Mask字段中的掩码;所述符合R印型数据匹配条件的下一状态存储于R印ExitM字段中 的指示R印型数据匹配成功后迁移至下一状态的地址;所述匹配模块,具体用于将待匹配报文中n2个字符分别对应的映射值与Mask字段 中的掩码进行比较,当n2个字符各自对应的映射值全部在所述掩码范围内时,根据所述 RepExitSt字段指示的下一状态的地址迁移到下一状态。
13.根据权利要求7所述的装置,其特征在于,所述匹配模块,还用于将待匹配报文的 第一个字符的数据类型判断为Char型。
14.根据权利要求9所述的装置,其特征在于,所述报文及DFA表载入单元还包含缓存, 所述缓存包括随机存取存储器RAM,所述RAM用于存储所述字符映射表和所述状态迁移表。
15.根据权利要求14所述的装置,其特征在于,所述装置还包括缓存管理单元,用于 判断和刷新所述缓存的空满状态并反馈给所述报文及DFA表载入单元。
全文摘要
本发明实施例提供了一种正则表达式匹配的方法及装置,该方法包括输入待匹配报文及DFA状态表,DFA状态表包括状态迁移表,其包括正则表达式匹配过程中的所有状态地址和各个状态之间的迁移关系;判断当前状态对应的数据类型,包括单个字符Char型和多个字符Str型,Str型对应的数据为连续的多个字符;若是Str型,则将待匹配报文中当前状态的多个字符值与匹配条件进行匹配处理,当匹配时,迁移至符合匹配条件的下一状态;若是Char型,则将待匹配报文中当前状态的单个字符值与匹配条件进行匹配处理,当匹配时,迁移至符合匹配条件的下一状态;当下一状态为接受态时,结束匹配过程并输出匹配成功结果。该方法匹配速度快、效率高,DFA表项占用的存储空间小。
文档编号G06F17/30GK102142009SQ20101058083
公开日2011年8月3日 申请日期2010年12月9日 优先权日2010年12月9日
发明者付饶, 徐敏锋, 时立峰, 段国莲, 程贵锋 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1