基于带记忆确定有限自动机的正则表达式匹配加速方法转让专利

申请号 : CN200710071071.0

文献号 : CN101201836B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王继民平玲娣潘雪增陈小平陈健陆魁军

申请人 : 浙江大学

摘要 :

本发明公开了一种基于带记忆确定有限自动机的正则表达式匹配加速方法。它包括正则表达式规则编译器和模式匹配引擎,正则表达式规则编译器先把正则表达式转换为解析树,再分别把解析树转换为带记忆的非确定有限自动机和带记忆的确定有限自动机,模式匹配引擎使用编译器生成的带记忆确定有限自动机实现对模式匹配的加速。本发明的优点是:1)因为直接支持了重复操作符,编译器可以不对重复表达式进行展开,大大降低了编译器开发难度,也降低了编译器的内存占用和编译时间;2)基于同样的原因,编译器生成的规则数据库大小也可大大减小,降低了模式匹配引擎的成本和复杂度。

权利要求 :

1.一种基于带记忆确定有限自动机的正则表达式匹配加速方法,其特征在于通过正则表达式规则编译器先把正则表达式转换为解析树,再分别把解析树转换为带记忆的非确定有限自动机和带记忆的确定有限自动机,模式匹配引擎使用编译器生成的带记忆确定有限自动机实现对模式匹配的加速,所述通过正则表达式规则编译器先把正则表达式转换为解析树,再分别把解析树转换为带记忆的非确定有限自动机和带记忆的确定有限自动机是:借助Lex和Yacc软件实现正则表达式上下文无关文法,对正则表达式规则语法进行解析,并在解析过程中根据匹配文法建立相应节点类型的子树,最终形成完整的解析树;在Thompson算法支持操作符的基础上,增加重复操作符({n,m}),其对应的非确定状态机与所重复表达式的非确定状态机相同,但增加了重复范围参数,使用该算法将解析树转换为带记忆的非确定有限自动机;对于不含重复操作符的非确定有限自动机,按ε-闭包算法生成确定有限自动机,而对于含有重复操作符的非确定有限自动机,则先用带有特殊标记的简单字符替换重复操作符,按ε-闭包算法把它转换为确定有限自动机,另外单独把被替换的部分按ε-闭包算法转换为另一个确定有限自动机;解析树由对应的正则表达式经解析生成,为一种每个节点分支不超过2的树,树中非叶节点为操作符,操作符包括连接操作符“·”、选择操作符“|”重复操作符“{n,m}”、Kleen闭包操作符“*”,叶子节点是单个字符、集合、集合的补集、代表集合的字符或代表集合补集的字符,集合与补集的转义字符序列符合IEEE POSIX 1003.2标准;所述的模式匹配引擎使用正则表达式规则编译器生成的带记忆确定有限自动机实现对模式匹配的加速是:模式匹配引擎读入正则表达式规则编译器生成的带记忆确定有限自动机和输入字符串,把输入字符串跟每个有限自动机进行匹配,匹配的位置保存在匹配上下文中;当一个有限自动机匹配完成,则根据该有限自动机类型确定下一步动作:如果该有限自动机不包含重复操作符,且没有后续有限自动机,则报告一个匹配;如果该有限自动机不包含重复操作符,但有后续有限自动机,则根据贪婪模式选项确定是否报告一个匹配,并生成一个后续有限自动机的匹配上下文;如果该有限自动机包含重复操作符,则增加匹配次数,并根据匹配次数决定下一步动作:如果匹配次数小于重复范围下限,则把匹配位置调整到有限自动机初始状态,继续匹配;如果匹配次数大于重复范围上限,则生成后续有限自动机的匹配上下文或报告一个匹配;如果匹配次数位于重复范围内,则把匹配位置调整到有限自动机初始状态,继续匹配;模式匹配引擎可以由现场可编程门阵列或专用集成电路实现,它实现了正则表达式数据库中的带记忆确定有限自动机,可接受输入数据,判断是否存在与库中正则表达式的匹配。

2.根据权利要求1所述的一种基于带记忆确定有限自动机的正则表达式匹配加速方法,其特征在于所述的正则表达式规则编译器:正则表达式规则编译器以正则表达式规则文件为输入,输出正则表达式数据库,首先对规则文件进行语法检查并把它转换为带记忆的非确定有限自动机,之后再转换为带记忆的确定有限自动机,带记忆的确定有限自动机存储在正则表达式数据库中。

说明书 :

技术领域

本发明涉及信息处理领域,尤其涉及一种基于带记忆确定有限自动机的正则表达式匹配加速方法。

背景技术

字符串匹配是信息处理领域最基本操作之一,是许多信息处理应用的基础。字符串匹配是在某个输入字符串(以下称为目标字符串)中找出与给定字符串(以下称为特征字符串)具有特定关系的子串的过程。字符串匹配可以分为字符串精确匹配和字符串模糊匹配两种,其中前者是在目标字符串中找出与特征字符串完全相同的子串,而后者则是在目标字符串中找出与特征字符串相似的特定子串(比如,目标字符串的子串比特征字符串增加、减少或修改一个或数个字符)。字符串的精确匹配应用尤为广泛。
正则表达式是由普通字符(例如字符a到z)和特殊字符(称为元字符)组成的文字模式,该模式可用于描述具有特定特征的一类字符串。比如“.*abc[0-9]$”描述了这样一类字符串:它的头部具有任意个任意字符,并以abc加一个数字结尾。正则表达式被广泛应用于字符串匹配,用来描述特征字符串。例如,在网关部署的内容过滤程序使用基于正则表达式的模式匹配查找并过滤具有不当内容的网络数据;反病毒程序利用基于正则表达式的特征库对病毒进行扫描;网络入侵检测与防御软件利用基于正则表达式的模式匹配对入侵企图进行识别。
基于正则表达式的模式匹配是计算密集型的任务,需要大量的CPU计算。例如,反病毒程序ClamAV的特征库目前已经具有超过11万条规则,但它需要在尽可能短的时间内判断出给定文件是否具有特征库中的特征。另外一个典型应用是部署在网关的内容过滤程序,它需要实时地对通过的数据流进行检测,并根据内容等级采取相应的动作。目前利用软件进行正则表达式匹配,吞吐率在几百Mbps到1Gbps之间,该性能在实际应用中会下降数倍到数十倍,还远不能满足实时扫描的需要。
基于硬件加速的正则表达式匹配方法是解决该矛盾的其中一个办法。利用专用集成电路(ASIC)或现场可编程门阵列(FPGA)实现正则表达式匹配引擎,可同样完成模式匹配,但可根据需要进行专门的优化,成倍地提高性能。
正则表达式的硬件加速通常用自动机实现。
重复操作符“(A){n,m}”是正则表达式中常见的一个操作符,它代表子表达式(A)至少重复n次,至多重复m次。重复操作符有三种形式:
(A){n,m},表示子表达式(A)至少重复n次,至多重复m次。
(A){n,},表示子表达式(A)至少重复n次。
(A){n},表示子表达式(A)重复n次。
在通常的模式匹配软件中,“(A){n,m}”操作符是不被直接支持的,通常会转换为连接操作符和选择操作符,如第一种形式“(A){n,m}”会被转换为:
(A)(A)...(A)|(A)(A)...(A)(A)|...|(A)(A)...(A)...(A) n个               (n+1)个                   m个
第二、三种形式的重复操作符相对简单,可分别展开为:
  (A)(A)...(A)·(A)*  n个
以及
  (A)(A)..(A)  n个
上述的转换方法虽然可以对重复操作符进行支持,但是,在重复次数多、范围大的时候,会使正则表达式的状态数急剧增加,造成对规则编译器和模式匹配引擎的巨大负担。比如“a{1,3072}”展开后会得到1+2+...+3072=4720128个状态!在重复的子表达式复杂时会形成状态爆炸。本发明针对这个问题提出了使用带记忆的状态机对重复操作符进行直接支持。
确定有限自动机和非确定有限自动机的定义、性能描述,以及从正则表达式构建非确定有限自动机的Thompson算法和从非确定有限自动机构造确定有限自动机的ε-闭包算法的描述,请参考Alfred V.Aho,Ravi Sethi和Jeffrey D.Ullman所著的《编译器:原理、技术与工具》一书;正则表达式的操作符及其意义,请参考Jeffrey E.F.Friedl所著的《掌握正则表达式》一书;软件Lex和Yacc的使用,请参考John Levine,Tony Mason,Doug Brown所著的《Lex与Yacc》一书。

发明内容

本发明的目的是提供一种基于带记忆确定有限自动机的正则表达式匹配加速方法。
基于带记忆确定有限自动机的正则表达式匹配加速方法包括正则表达式规则编译器和模式匹配引擎,正则表达式规则编译器先把正则表达式转换为解析树,再分别把解析树转换为带记忆的非确定有限自动机和带记忆的确定有限自动机,模式匹配引擎使用编译器生成的带记忆确定有限自动机实现对模式匹配的加速。
其特征在于所述的正则表达式规则编译器先把正则表达式转换为解析树,再分别把解析树转换为带记忆的非确定有限自动机和带记忆的确定有限自动机:借助Lex和Yacc软件实现正则表达式上下文无关文法,对正则表达式规则语法进行解析,并在解析过程中根据匹配文法建立相应相应节点类型的子树,最终形成完整的解析树;在Thompson算法支持操作符的基础上,增加重复操作符({n,m}),其对应的非确定状态机与所重复表达式的非确定状态机相同,但增加了重复范围参数,使用该算法将解析树转换为带记忆的非确定有限自动机;对于不含重复操作符的非确定有限自动机,按ε-闭包算法生成确定有限自动机,而对于含有重复操作符的非确定有限自动机,则先用带有特殊标记的简单字符替换重复操作符,按ε-闭包算法把它转换为确定有限自动机,另外单独把被替换的部分按ε-闭包算法转换为另一个确定有限自动机;解析树由对应的正则表达式经解析生成,为一种每个节点分支不超过2的树,树中非叶节点为操作符,叶子节点为字符或集合,操作符包括连接操作符(“·”)、选择操作符(“|”)、重复操作符(“{n,m}”)、Kleen闭包操作符(“*”),叶子节点是单个字符、集合、集合的补集、代表集合的字符或代表集合补集的字符,集合与补集的转义字符序列符合IEEE POSIX 1003.2标准。
所述的编译器:编译器以正则表达式规则文件为输入,输出正则表达式数据库,它首先对规则文件进行语法检查并把它转换为带记忆的非确定有限自动机,之后再转换为带记忆的确定有限自动机,带记忆的确定有限自动机存储在规则数据库中。
所述的模式匹配引擎使用编译器生成的带记忆确定有限自动机实现对模式匹配的加速:模式匹配引擎读入编译器生成的带记忆确定有限自动机和输入字符串,把输入字符串跟每个有限自动机进行匹配,匹配的位置保存在匹配上下文中;当一个有限自动机匹配完成,则根据该自动机类型确定下一步动作:如果该自动机不包含重复操作符,且没有后续自动机,则报告一个匹配;如果该自动机不包含重复操作符,但有后续有限自动机,则根据贪婪模式选项确定是否报告一个匹配,并生成一个后续有限自动机的匹配上下文;如果该自动机包含重复操作符,则增加匹配次数,并根据匹配次数决定下一步动作:如果匹配次数小于重复范围下限,则把匹配位置调整到自动机初始状态,继续匹配;如果匹配次数大于重复范围上限,则生成后续状态机的匹配上下文或报告一个匹配;如果匹配次数位于重复范围内,则把匹配位置调整到自动机初始状态,继续匹配;模式匹配引擎可以由现场可编程门阵列或专用集成电路实现,它实现了正则表达式数据库中的带记忆确定有限自动机,可接受输入数据,判断是否存在与库中正则表达式的匹配。
本发明的优点是:1)因为直接支持了重复操作符,编译器可以不对重复表达式进行展开,大大降低了编译器开发难度,也降低了编译器的内存占用和编译时间;2)基于同样的原因,编译器生成的规则数据库大小也可大大减小,降低了模式匹配引擎的成本和复杂度。

附图说明

图1是基本操作符及其对应的解析树;
图2是规则“(a|([0-9])){1,30}c*d”对应的解析树;
图3是叶子节点(单字符)对应的非确定有限自动机;
图4是叶子节点(集合)对应的非确定有限自动机;
图5是连接操作符对应的非确定有限自动机;
图6是选择操作符对应的非确定有限自动机;
图7是Kleen闭包操作符对应的非确定有限自动机;
图8是规则“(a|([0-9])){1,30}c*d”对应的按照Thompson算法转换成的非确定有限自动机;
图9是规则“(a|([0-9])){1,30}c*d”对应的解析树按改进算法转换成的非确定有限自动机;
图10是规则“(a|([0-9])){1,30}c*d”对应的非确定有限自动机按照经典ε-闭包算法转换成的确定有限自动机;
图11是规则“(a|([0-9])){1,30}c*d”对应的非确定有限自动机按改进算法转换成的确定有限自动机;
图12是本发明中模式匹配引擎结构图;
图13是本发明模式匹配引擎中上下文调度流程图;
图14是本发明模式匹配引擎的主要执行流程图。

具体实施方式

基于带记忆确定有限自动机的正则表达式匹配加速方法:其核心是使用带记忆的确定有限自动机对重复操作符(A{n,m})进行直接支持,这样在基本不降低匹配性能的条件下,对于存在大量重复的规则,可大幅降低生成确定有限自动机(DFA)的规模,降低存储代价。同时,也可简化编译器的设计,大幅减少规则处理时间。要使用带记忆的确定有限自动机,规则编译器和模式匹配引擎必须同时对它提供支持。
所述的规则描述文件:规则描述文件中包含了需要查找的特征字符串(正则表达式)。规则描述文件中可以有任意条规则,每条规则由以下部分组成:唯一的标识,用于跟其他规则进行区分;规则体,描述了一条正则表达式;规则选项,指定匹配规则时的选项,比如是否忽略字母大小写。
规则编译器:规则编译器完成规则到规则数据库的转换。在读取规则描述文件后,对其中的规则进行语法检查,然后,把符合语法定义的规则转换为解析树,并进行预处理和必要的优化;再把解析树转换为带记忆的非确定有限自动机和确定有限自动机,并把所有确定有限自动机写入规则数据库供模式匹配引擎使用。
模式匹配引擎:实现正则表达式的模式匹配。读入编译器生成的规则数据库,以待匹配的数据为输入,匹配完成后输出匹配结果。结果包括以下数据:是否有匹配;如果有匹配,匹配的特征字符串标识、匹配的起始(结束)位置、实际匹配长度。
基于带记忆确定有限自动机的正则表达式匹配加速方法的具体步骤如下:
1)准备正则表达式规则文件。
正则表达式规则文件中包含了正则表达式规则,以及相关的其他信息。每行描述一条正则表达式规则及其相关信息,例如:
  Id=1001,Rule=”abc[0-9]$”,Option=””  Id=1002,Rule=”  http://[0-9a-z]+\.google\.[a-z]+[\-/%.0-9a-z]*/images\?)(.*)(&?)(safe=[^&]*”,Option  =”i”
上面是一个规则文件的例子,其中有两条规则,每条规则由三个部分构成,第一部分为规则标识符,由Id=xxx给出;第二部分为规则体,由Rule=”...”给出;第三部分为相关选项,由Option=”...”给出。
规则体部分描述了特征正则表达式,其语法符合IEEE POSIX 1003.2标准。
2)用规则编译器把规则文件编译为规则数据库。
规则编译器完成规则文件到规则数据库的转换工作。该工作分四个步骤完成:
A.对规则文件进行语法检查,同时生成解析树。
正则表达式的语法可以由上下文无关文法描述,因此可以使用Lex和Yacc编译工具生成语法解析器(Parser),对正则表达式的语法进行检查。例如正则表达式顶层语法用Yacc可表述为:
:==//特殊匹配(比如′.′)       |//单个字符       |//预定义字符集合       |//用户自定义字符集合       |//连接操作符       |′|′//选择操作符       |//重复(比如′*′)       |′(′′)′//分组
在进行语法检查的同时,也可利用Yacc的动作部分定义生成语法解析树(Parse Tree)。解析树为一种每个节点分支不超过2的树,树中非叶节点为操作符,叶子节点为字符或集合。操作符包括连接操作符(“·”)、选择操作符(“|”)、重复操作符(“{n,m}”)、Kleen闭包操作符(“*”)。叶子节点可以是单个字符(如“a”)、集合(如“[a-z]”、“[abc123]”)、集合的补集(如“[^a-z]”、“[^abc123]”)、代表集合的字符(如“\d”,它代表“[0-9]”)或代表集合补集的字符(如“\D”,它代表“[^0-9]”)等。集合与补集的转义字符序列符合IEEE POSIX 1003.2标准。连接操作符(“·”)、选择操作符(“|”)、重复操作符(“{n,m}”)、Kleen闭包操作符(“*”)生成解析树的过程分别如图1所示。
规则“(a|([0-9])){1,30}c*d”对应的解析树如图2所示。图中“{}”节点代表“{n,m}”重复节点,“[]”节点代表集合节点。具体的内容(重复节点中的n和m以及集合节点中集合的具体元素)由节点相关参数给出,即“{}”节点具有参数(1,30),“[]”节点具有参数(0,1,2,3,4,5,6,7,8,9)。
B.对解析树进行必要的预处理和优化。
到目前为止,解析树中还包含了一些在后面步骤中不能直接支持的元素,因此必须通过一定的处理使之变成可直接支持的元素。主要的预处理有:
“+”操作符的处理,“+”操作符在后面步骤中不直接支持,需要转换为“*”,如“a+”需转换为“aa*”。该预处理可通过在解析树上增加节点并重构解析树完成。
预定义字符集合的处理。通过转义字符定义的字符集合不被直接支持,需要把其中的元素提取出来,明确指定。如“\d”转换为“[0-9]”,“\D”转换为“[^0-9]”“[:alphanum:]”转换为“[0-9a-zA-Z]”。该预处理可直接修改节点参数实现。
顶层选择操作符的分割。如果解析树的根为选择节点“|”则该解析树可分割为两棵解析树而不影响匹配结果。该过程循环执行直到根节点不再是“|”。如“A|B|C”处理后变为三棵解析树,分别为“A”、“B”、“C”。除预处理外,还需进行优化操作。优化操作的目的是在不改变解析树语义的情况下降低表达式的存储或匹配代价。
C.把解析树转换为带记忆的非确定有限自动机。
把解析树转换为非确定有限自动机,借助改进的Thompson算法。除Thompson算法原来支持的操作符外,另外增加对重复操作符的支持。对解析树进行一趟后续遍历,即可完成非确定有限自动机的生成。
对于不同类型节点,其状态机均由子树的状态机推导得出。
◆节点类型为叶子节点(单个字符)时,对应非确定有限自动机如图3所示。
◆节点类型为叶子节点(集合)时,对应非确定有限自动机如图4所示。
◆节点类型为连接操作符,假设左右子树对应起始状态分别为I1、I2;对应终结状态分别为F1、F2,对应非确定有限自动机如图5所示。
◆节点类型为选择操作符,假设左右子树对应起始状态分别为I1、I2;对应终结状态分别为F1、F2,对应非确定有限自动机如图6所示。
◆节点类型为Kleen闭包操作符,假设子树对应起始状态为I1;对应终结状态为F1,对应非确定有限自动机如图7所示。
◆节点类型为重复操作符时,生成的非确定有限自动机与子树的非确定有限自动机相同,但需标上特殊标记,并存储重复范围。
另外,在遍历过程中,每处理到一个新的重复节点,就生成一个新的非确定有限自动机,并记录相关非确定有限自动机间的连接关系。
规则“(a|([0-9])){1,30}c*d”对应的解析树按照Thompson算法转换成的非确定有限自动机如图8所示;同一规则按改进算法转换成的非确定有限自动机如图9所示,图中“EP”代表ε边,椭圆形和圆形节点代表状态,带箭头的边表示状态转换,边所附的字符为转换字符。如果箭头为圆头,则转换条件为集合,集合元素由关联参数给出。
D.把带记忆的非确定有限自动机转换为带记忆的确定有限自动机。
把非确定有限自动机转换为确定有限自动机,使用改进的ε-闭包方法。它经典ε-闭包方法不同之处有:对于生成的自动机,增加参数,记录其类型是否需要重复执行;如果需要,还要记录其重复范围。生成的状态机为“满状态机”,即在每个节点都存在对应于0-255输入字符的共256条转换边。如果在非确定有限自动机中不存在某个特定的转换,则在确定有限自动机中增加一条这样的转换,转入的状态为新增的特殊状态——REJECT(拒绝状态,表明匹配失败)。另外,由于前一步骤中,以重复操作符为边界,把解析树分为多个部分,分别转换为非确定有限自动机,并记录了自动机之间的关系,在该步骤中,用ε-闭包方法把每个非确定有限自动机转换为确定有限自动机,同时也许记录自动机之间的连接关系。
规则“(a|([0-9])){1,30}c*d”对应的非确定有限自动机按照经典ε-闭包算法转换成的确定有限自动机如图10所示;同一规则按改进算法转换成的确定有限自动机如图11所示。图中椭圆形和圆形节点代表状态,带箭头的边表示状态转换,边所附的字符为转换字符。
3)使用模式匹配引擎对输入字符串进行匹配
模式匹配引擎完成输入字符串与特征字符串(正则表达式生成的状态自动机)之间的匹配。模式匹配引擎可以由现场可编程门阵列(FPGA)或专用集成电路(ASIC)实现,它实现了正则表达式数据库中的带记忆确定有限自动机,可接受输入数据,判断是否存在与库中正则表达式的匹配。模式匹配引擎的结构如图12所示,图中
(1)规则库,规则数据库在模式匹配引擎中的保存形式,其中记录了编译后的确定有限自动机,各自动机之间的连接关系,以及以重复操作符为根的确定有限自动机的重复次数等。
(2)执行引擎,模式匹配的执行单元,它负责读入待匹配数据,进行快速分类,创建匹配上下文,以及匹配上下文在各个状态机之间的跳转等。
(3)快速分类引擎,根据输入数据快速确定相关的确定有限自动机,并由执行引擎创建相应的匹配上下文。
(4)匹配上下文,记录了当前正在匹配的状态机,当前所处的状态等信息,如果是处于重复操作符为根的状态机,还记录已经匹配的次数。
(5)规则数据库,规则编译器对规则进行编译后形成的、模式匹配引擎可以读入的二进制文件,其中保存了各个确定有限自动机的状态、各个状态的跳转关系等。如果是重复操作符为根的状态机,还记录重复范围参数。
(6)输入/输出数据,模式匹配引擎与外界交换的信息。输入数据主要是指待匹配的数据流,也可能包括部分配置模式匹配引擎的数据;输出数据是指模式匹配引擎的匹配结果,包括匹配是否成功,匹配位置、匹配次数等。
模式匹配的执行流程分别如图13和图14所示。其中图13是上下文调度流程,图14是匹配引擎的主要执行流程。