专利名称:正则表达式匹配的方法和系统的制作方法
技术领域:
本发明涉及数据处理领域,特别涉及一种正则表达式匹配的方法和系统。
背景技术:
正则表达式描述了一种字符串匹配的模式,可以用来进行文本匹配,具体为在给 定的字符串中寻找与给定的正则表达式相匹配的部分。正则表达式的应用范围很广,在通 信行业中主要应用于对数据流量进行模式匹配检查,如进行协议解析、病毒检测和业务分
大寸寸。现有技术中,进行正则表达式匹配检查需要预先将正则表达式转换成 DFA (Deterministic Finite Automata,有限自动机),然后逻辑芯片根据编译后的DFA和 输入的数据流中的字符,来执行这个DFA。但由于一般使用时,待检查的规则都不只一条, 而是几千甚至上万条,单独的采用一个个的DFA对待匹配流量检查几千甚至上万次是不可 能的,因此为了不遗漏待检查的规则,一般都将这几千甚至上万条规则编译成一个大型的 DFA ( 一般有几百兆字节甚至IG字节),在匹配进行中,将待匹配的流量做为输入,以DFA报 告的输出作为匹配规则。在对现有技术进行分析后,发明人发现现有技术至少具有如下缺点由于大型的DFA大小有几百兆字节,而一般的逻辑芯片内部无法集成这样大容量 的片内存储器,只能是存储在外部的SRAM (Static Random AccessMemory,静态随机存储 器)或者 SDRAM (Synchronous Dynamic Random AccessMemory,同步动态随机存储器)中, 待匹配时,匹配到什么状态,就把这个状态相应的一部分DFA片段加载进入逻辑芯片内部 的缓存进行工作,在匹配过程中,需不断加载与当前状态关联的数据表项,并且经常由于状 态的跳转而重复加载与状态关联的数据表项,DFA越复杂,加载的数据表项就越多,这种匹 配的方法所需时间长,浪费存储资源,匹配性能低。
发明内容
本发明实施例提供了一种正则表达式匹配的方法和系统。所述技术方案如下一方面,一种正则表达式匹配的方法,包括将多个正则表达式分组,得到多个正则表达式组,其中每个正则表达式组中的每 个正则表达式包括相同的字符串,称为广义字符串;将每个所述正则表达式组编译成有限自动机,并建立每个正则表达式组的广义字 符串与有限自动机的关联关系;用所述广义字符串分别匹配待匹配的数据流,将匹配上的广义字符串作为匹配字 符串;获取与所述匹配字符串对应的有限自动机;根据所述有限自动机对所述待匹配的数据流进行正则表达式匹配并输出匹配结^ O
另一方面,一种正则表达式匹配的系统,包括分组编译设备,用于将多个正则表达式分组,得到多个正则表达式组,其中每个正 则表达式组中的每个正则表达式包括相同的字符串,称为广义字符串;将每个所述正则表 达式组编译成有限自动机,并建立每个正则表达式组的广义字符串与有限自动机的关联关 系;匹配设备,用于匹配所述广义字符串和待匹配的数据流,将匹配上的广义字符串 作为匹配字符串;获取与所述匹配字符串对应的有限自动机;根据所述有限自动机对所述 待匹配的数据流进行正则表达式匹配并输出匹配结果。本发明实施例提供的技术方案的有益效果 是通过将多个正则表达式根据字符串分组,分别对每个正则表达式组编译,得到多 个有限自动机,并利用用于分组的字符串对待匹配的数据流进行匹配,再利用匹配的结果 加载有限自动机以进行正则表达式匹配,减少了匹配的过程中需要加载的数据,缩短了加 载的过程,从而减少了正则表达式匹配时数据加载所消耗的时间,提高了匹配性能。
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可 以根据这些附图获得其他的附图。图1是现有技术中的DFA的状态示意图;图2是本发明实施例1提供的一种正则表达式匹配的方法;图3是本发明实施例2提供的一种正则表达式匹配的方法;图4是本发明实施例3提供的一种正则表达式匹配的系统示意图;图5是本发明实施例3提供的一种正则表达式匹配的系统示意图。
具体实施例方式为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方 式作进一步地详细描述。在介绍本发明提供的正则表达式的匹配方法之前,首先对正则表达式的工作方式 进行简要的介绍正则表达式一般包括表示匹配次数的量词、表示具体位置的锚点和字符串。如有这样的一个正则表达式.*AUTH
{10},这表示需要在待匹配的文本中 找到这样的一个字符串,其特征是文本中有一个AUTH的字符串,其后直接跟随了 10个 0 9之间的任意某个数字字符。这样的话,可能匹配上的字符文本就可以为http:// AUTH2009120901.html/ index,其中的粗体部分就是可以匹配上这个正则表达式的字 串ο其次,对DFA进行简单的介绍,参见图1,DFA实际上是自动状态机,其由多个状态 (图中的小圆)、每个状态的输入(箭头上的字符)及转换边(箭头)组成,其特点是对每 一个状态下,确定的输入一定有一个确定的输出,如图1中所示的S状态下输入a —定会转移到U状态。
实施例1为了减少正则表达式匹配过程中的数据加载消耗的时间,提高匹配性能,本发明 实施例提供了一种正则表达式匹配的方法,参见图2,该方法包括201 将多个正则表达式分组,得到多个正则表达式组,其中每个正则表达式组中 的每个正则表达式包括相同的字符串,称为广义字符串;202 将每个该正则表达式组编译成有限自动机,并建立每个正则表达式组的广义 字符串与有限自动机的关联关系;203:用该广义字符串分别匹配待匹配的数据流,将匹配上的广义字符串作为匹配 字符串;204 获取与该匹配字符串对应的有限自动机;205:根据该有限自动机对该待匹配的数据流进行正则表达式匹配并输出匹配结^ ο其中,本发明实施例所述的字符串是指正则表达式中的可打印字符和不可打印字 符组合所代表的含义,例如,有正则表达式.^AUTH
{10},对于该正则表达式来说,其字 符串可以为auth,即是数据中必须有“auth”,本发明实施例对此不做具体限定。本发明实施例通过将多个正则表达式根据字符串分组,分别对每个正则表达式组 编译,得到多个有限自动机,并利用用于分组的多个字符串对待匹配的数据流进行匹配,再 利用匹配的结果加载有限自动机以进行正则表达式匹配,减少了匹配的过程中需要加载的 数据,缩短了加载的过程,从而减少了正则表达式匹配时数据加载所消耗的时间,提高了匹 配性能。实施例2为了减少正则表达式匹配过程中的数据加载消耗的时间,提高匹配性能,本发明 实施例提供了一种正则表达式匹配的方法,参见图3,该方法包括301 当匹配条件为多个正则表达式时,将该多个正则表达式分成多个正则表达式 组,每个正则表达式组内的每个正则表达式均包括相同的字符串,将用以区分各个正则表 达式组的该字符串称为广义字符串;在本步骤301中,对字符串本身没有要求,只要是正则表达式包含相同的字符串, 就可以归入一组内。例如,当两个正则表达式中均具有表示“数据需包含ace”的字符串,可将这两个正 则表达式分在一个组内。进一步地,如果包括相同字符串的正则表达式数量超过预设的阈值,则将该多个 正则表达式分成多组,其中每组内包含的正则表达式数量小于预设的阈值,以使后续的步 骤中,经过编译后的有限自动机不会过大。例如,当包含相同字符串的正则表达式有12个,而预设一正则表达式组中正则表 达式的数量不得超过10时,可将该12个正则表达式进一步细分,可以分为6个一组,也可 以一组10个,另一组2个,具体的分组可以根据用户的预设进行,该细分方式有多种,本发 明实施例对此不做具体限定。302 将每个正则表达式组分别进行编译,得到多个有限自动机;
本领域技术人员可以获知,由于在实际操作时,DFA的尺寸较大,所以将一条或几条有相同字符串的的正则表达式编译成一个小尺寸的DFA,这样原先的一个非常大尺寸的 DFA就被编译成了大量的小尺寸的DFA。优选地,该DFA的大小不大于逻辑芯片内部可分配给缓存DFA片段的cache空间 大小,以便在后续加载的步骤中,使得缓存DFA片段可以顺利加载至少一个小尺寸的DFA ; 如果编译后的DFA大于逻辑芯片内部可分配给缓存DFA片段的cache空间大小,本领域技 术人员可以获知,其加载方式可以有多种,本发明实施例对此不做具体限定。另外,编译成 一个DFA的正则表达式的条数可以根据设计的具体要求设置,本发明实施例对此不做具体 限定。需要说明的是,该编译的过程可以理解为一个将正则表达式分组然后进行编译的 过程,为了提高匹配的精度,还可以对正则表达式的分组数量进行限制,该限制可以根据系 统的设置设定,本发明实施例不做具体限定。303:建立每个广义字符串和其所对应正则表达式组编译成的有限自动机之间的 关联关系;本领域技术人员可以获知,该关联关系的表现形式有多种,具体可以是存储在内 存中的列表形式,在该列表中,广义字符串和有限自动机一一对应,本发明实施例对此不做 具体限定。例如,如果该正则表达式组A中的正则表达式均带“ace”字符串,则在将该正则表 达式组A编译成有限自动机A’后,建立广义字符串“ace”和有限自动机A’之间的关联关系。需要说明的是,当广义字符串对应的正则表达式组有多个时,可为广义字符串和 多个有限自动机之间建立关联关系。具体地,建立每个广义字符串和其所对应正则表达式组编译成的有限自动机之间 的关联关系包括建立用于正则表达式分组的广义字符串与正则表达式组编译成的有限自 动机存放地址之间的映射关系,以使后续步骤中可根据该映射关系加载有限自动机,使有 限自动机的加载更加迅速、准确。优选地,先将广义字符串采用hash函数映射到一个固定 长度的较短的数值空间上去,由于hash函数有hash冲突的发生,在这个映射到的地址上会 放置上几个都映射到这个地址上的广义字符串原始值和对应的DFA存放地址,在后续步骤 中,可通过对比检查广义字符串原始值,找到对应的DFA存放地址。其中,hash就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输 出就是散列值。这种转换是一种压缩映射,其散列值的空间通常远小于输入的空间,不同的 输入可能会散列成相同的输出,而不可能从散列值来确定输入值。也可以说,hash就是找 到一种数据内容和数据存放地址之间的映射关系。在本发明实施例中使用hash函数映射 的方法可以节约数据空间,加速后续加载的速度。优选地,该步骤301-步骤302是由计算机完成的,进一步地,将编译好的多个DFA 存储在外存中,以备后续加载的步骤使用。本领域技术人员可以获知,外存是指FPGA (Field Programmable Gate Array,现场可编程门阵列)外部的存储器件,如DDR SDRAM (Double Data Rate SDRAM,双倍速率同步动态随机存储器),可以理解为通用计算机的内存。304 用该多个广义字符串对待匹配的数据流进行匹配;
本领域技术人员可以获知,该匹配的方法即是用字符串匹配数据的过程,不再赘 述。305:判断待匹配的数据流中是否有与该多个广义字符串中至少一个广义字符串 匹配的数据,如果是,执行步骤306;
如果否,结束。在本发明实施例中,在正式进行正则表达式匹配之前先采用广义字符串对待匹配 的数据流进行预检查,提前判断出可能匹配上的正则表达式,可大大减少加载消耗时间。此时,在本实施例中,如果待匹配的数据流中有与广义字符串匹配的数据,则说 明,该待匹配的数据流中含有与该正则表达式匹配的数据,在这个过程中,初步对待匹配的 数据流进行了粗略的匹配。需要说明的是,如果待匹配的数据流中没有与该多个广义字符串中至少一个广义 字符串匹配的数据,则说明待匹配的数据流和所有正则表达式不匹配,即可以结束该匹配 过程。306 将匹配上的广义字符串作为匹配字符串;307 根据广义字符串与有限自动机的关联关系,获取与匹配字符串对应的DFA ;进一步地,该步骤307可以为根据该匹配字符串与有限自动机存放地址之间的 映射关系,获取与该匹配字符串相对应的DFA。在实际操作中,该获取的步骤可以具体为 通过该映射关系,对比检查字符串原始值,取出对应的DFA存放地址,将该存放地址中的 DFA加载到缓存(内存)上。缓存指的是FPGA内部的BRAM资源,容量小,速度快,可以将其 理解成通用计算机的cache。本领域技术人员可以获知,该映射关系还可以用其他的方法来实现,例如,在步骤 303时,对广义字符串和有限自动机进行编号,将其具体对应关系存表,在后续的步骤中,则 根据该表中的编号所表示的关系来查询需加载的有限自动机等,本发明实施例对此不做具 体限定。308 根据该DFA对待匹配的数据流进行正则表达式匹配,得到最终的匹配结果;本领域技术人员可以获知,将判断输入内容中是否包含正则表达式所表示规则的 操作称为正则表达式匹配,一般是用输入字符串来表示正则表达式匹配系统的输入参数, 用匹配结果来表示正则表达式匹配系统的输出结果。309 输出匹配结果,结束。优选地,上述步骤303-步骤309由可编程逻辑芯片内FPGA完成,还可以由具有类 似编程逻辑功能的可编程器件完成。本发明实施例通过将多个正则表达式根据字符串分组,分别对每个正则表达式组 编译,得到多个有限自动机,并利用用于分组的多个字符串对待匹配的数据流进行匹配,再 利用匹配的结果加载有限自动机以进行正则表达式匹配,减少了匹配过程中需要加载的数 据,缩短了加载的过程,从而减少了正则表达式匹配时数据加载所消耗的时间,提高了匹配 性能。实施例3为了减少正则表达式匹配过程中的数据加载消耗的时间,提高匹配性能,本发明实施例提供了一种正则表达式匹配的系统,参见图4,该系统包括分组编译设备A,用于将多个正则表达式分组,得到多个正则表达式组,其中每个 正则表达式组中的每个正则表达式包括相同的字符串,称为广义字符串;将每个所述正则 表达式组编译成有限自动机,并建立每个正则表达式组的广义字符串与有限自动机的关联 关系;匹配设备B,用于匹配所述广义字符串和待匹配的数据流,将匹配上的广义字符串 作为匹配字符串;获取与所述匹配字符串对应的有限自动机;根据所述有限自动机对所述 待匹配的数据流进行正则表达式匹配并输出匹配结果。参见图5,该分组编译设备A包括分组模块501,用于将多个正则表达式分组,得到多个正则表达式组,其中每个正 则表达式组中的每个正则表达式包括相同的字符串,称为广义字符串; 编译模块502,用于将分组模块501分得的每个该正则表达式组编译成有限自动 机,并建立每个正则表达式组的广义字符串与有限自动机的关联关系;该编译模块502包括映射关系建立单元5021,用于建立该每个正则表达式组的广义字符串与该有限自 动机存放地址之间的映射关系。优选地,该分组编译设备A为计算机。相应地,该匹配设备B包括预匹配模块503,用于用所述广义字符串分别匹配待匹配的数据流,将匹配上的广 义字符串作为匹配字符串;该预匹配模块503包括判断单元5031,用于判断待匹配的数据流中是否有与多个该广义字符串中至少一 个广义字符串匹配的数据,如果是,触发用于将匹配上的广义字符串作为匹配字符串的预 匹配单元5032,如果否,触发用于结束匹配的终止单元5033。获取模块504,用于获取与预匹配模块503得到的该匹配字符串对应的有限自动 机;该获取模块504包括查询单元5041,用于根据该广义字符串与该有限自动机存放地址之间的映射关 系,查询与该匹配字符串对应的有限自动机存放地址;获取单元5042,用于获取查询单元5041查询到的该存放地址中的有限自动机。匹配模块505,用于根据获取模块504获取的该有限自动机对该待匹配的数据流 进行正则表达式匹配并输出匹配结果。优选地,该匹配设备B为可编程逻辑芯片内的FPGA。本实施例提供的系统,与方法实施例属于同一构思,其具体实现过程详见方法实 施例,这里不再赘述。本发明实施例通过将多个正则表达式根据字符串分组,分别对每个正则表达式组 编译,得到多个有限自动机,并利用用于分组的多个字符串对待匹配的数据流进行匹配,再 利用匹配的结果加载有限自动机以进行正则表达式匹配,减少了匹配过程中需要加载的数 据,缩短了加载的过程,从而减少了正则表达式匹配时数据加载所消耗的时间,提高了匹配性能。本发明实施例提供的上述技术方案的全部或部分可以通过程序指令相关的硬件来完成,所述程序可以存储在可读取的存储介质中,该存储介质包括R0M、RAM、磁碟或者光 盘等各种可以存储程序代码的介质。以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和 原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
一种正则表达式匹配的方法,其特征在于,包括将多个正则表达式分组,得到多个正则表达式组,其中每个正则表达式组中的每个正则表达式包括相同的字符串,称为广义字符串;将每个所述正则表达式组编译成有限自动机,并建立每个正则表达式组的广义字符串与有限自动机的关联关系;用所述广义字符串分别匹配待匹配的数据流,将匹配上的广义字符串作为匹配字符串;获取与所述匹配字符串对应的有限自动机;根据所述有限自动机对所述待匹配的数据流进行正则表达式匹配并输出匹配结果。
2.根据权利要求1所述的方法,其特征在于,所述建立每个正则表达式组的广义字符 串与有限自动机的关联关系具体包括建立每个正则表达式组的广义字符串与有限自动机存放地址之间的映射关系。
3.根据权利要求2所述的方法,其特征在于,获取与所述匹配字符串对应的有限自动 机,具体包括根据所述广义字符串与有限自动机存放地址之间的映射关系,查询与所述匹配字符串 对应的有限自动机存放地址,并获取所述存放地址中的有限自动机。
4.根据权利要求1所述的方法,其特征在于,用所述广义字符串分别匹配待匹配的数 据流,将匹配上的广义字符串作为匹配字符串具体包括判断待匹配的数据流中是否有与多个所述广义字符串中至少一个广义字符串匹配的 数据,如果是,将匹配上的广义字符串作为匹配字符串,如果否,结束匹配。
5.一种正则表达式匹配的系统,其特征在于,包括分组编译设备,用于将多个正则表达式分组,得到多个正则表达式组,其中每个正则表 达式组中的每个正则表达式包括相同的字符串,称为广义字符串;将每个所述正则表达式 组编译成有限自动机,并建立每个正则表达式组的广义字符串与有限自动机的关联关系;匹配设备,用于匹配所述广义字符串和待匹配的数据流,将匹配上的广义字符串作为 匹配字符串;获取与所述匹配字符串对应的有限自动机;根据所述有限自动机对所述待匹 配的数据流进行正则表达式匹配并输出匹配结果。
6.根据权利要求5所述的系统,其特征在于,所述分组编译设备包括分组模块,用于将多个正则表达式分组,得到多个正则表达式组,其中每个正则表达式 组中的每个正则表达式包括相同的字符串,称为广义字符串;编译模块,用于将每个所述正则表达式组编译成有限自动机,并建立每个正则表达式 组的广义字符串与有限自动机的关联关系;相应地,所述匹配设备包括预匹配模块,用于用所述广义字符串分别匹配待匹配的数据流,将匹配上的广义字符 串作为匹配字符串;获取模块,用于获取与所述匹配字符串对应的有限自动机;匹配模块,用于根据所述有限自动机对所述待匹配的数据流进行正则表达式匹配并输 出匹配结果。
7.根据权利要求6所述的系统,其特征在于,所述编译模块包括映射关系建立单元,用于建立每个正则表达式组的广义字符串与有限自动机存放地址 之间的映射关系。
8.根据权利要求7所述的系统,其特征在于,所述获取模块包括查询单元,用于根据所述广义字符串与有限自动机存放地址之间的映射关系,查询与 所述匹配字符串对应的有限自动机存放地址;获取单元,用于获取所述存放地址中的有限自动机。
9.根据权利要求6所述的系统,其特征在于,所述预匹配模块包括判断单元,用于判断待匹配的数据流中是否有与多个所述广义字符串中至少一个广义 字符串匹配的数据,如果是,触发用于将匹配上的广义字符串作为匹配字符串的预匹配单 元,如果否,触发用于结束匹配的终止单元。
全文摘要
本发明公开了一种正则表达式匹配的方法和系统,属于计算机领域。该方法包括将多个正则表达式分组,得到多个正则表达式组,其中每个正则表达式组中的每个正则表达式包括相同的字符串,称为广义字符串;将每个该正则表达式组编译成有限自动机,并建立每个正则表达式组的广义字符串与有限自动机的关联关系;用该广义字符串分别匹配待匹配的数据流,将匹配上的广义字符串作为匹配字符串;获取与该匹配字符串对应的有限自动机;根据该有限自动机对该待匹配的数据流进行正则表达式匹配并输出匹配结果。本发明缩短了数据加载的过程,减少了数据加载所消耗的时间,提高了匹配性能。
文档编号G06F17/30GK101853301SQ20101018755
公开日2010年10月6日 申请日期2010年5月25日 优先权日2010年5月25日
发明者胡新宇, 陈建 申请人:华为技术有限公司