CN109977298A - 一种从正则表达式中抽取最长精确子串的方法 - Google Patents
一种从正则表达式中抽取最长精确子串的方法 Download PDFInfo
- Publication number
- CN109977298A CN109977298A CN201910116717.5A CN201910116717A CN109977298A CN 109977298 A CN109977298 A CN 109977298A CN 201910116717 A CN201910116717 A CN 201910116717A CN 109977298 A CN109977298 A CN 109977298A
- Authority
- CN
- China
- Prior art keywords
- node
- prefix
- accurate
- substring
- character
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Machine Translation (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种从正则表达式中抽取最长精确子串的方法,步骤包括:构造正则表达式的解析树,获得可以进行解析树遍历访问的根节点;将解析树的CONCAT路径上的CONCAT节点的边都进行切分,把解析树切分成多个子树,每个子树即为一个基本单元;新建一个节点作为精确串锚点,用以存储精确串,同时记录该精确串锚点的左右邻居,该精确串为只有单个字符的基本单元或者由连续CONCAT操作符切分的字符拼接而成;通过对精确串锚点的左邻居和右邻居分别计算后缀和前缀,通过对后缀、精确串、前缀的拼接即可得到基于该精确串锚点抽取的精确子串,再通过对所有精确串锚点的计算,得到最长精确子串。
Description
技术领域
本发明涉及计算机信息处理与识别技术领域,具体涉及一种从正则表达式中抽取最长精确子串的方法。
背景技术
在海量信息的背景下,网络应用对匹配引擎的性能提出了更高的要求[1]。深度包检测(Deep Packet Inspection)技术[2]是一种先进的包过滤技术,其在学术界有着广泛的研究[3,4,5,6]。通过对数据包进行内容分析,可以识别并阻止特定的数据包。深度包检测不仅是在网络入侵领域有着重要的应用,在很多其他领域如反病毒系统,垃圾邮件过滤和高性能防火墙等领域也有广泛的应用[7,8,9,10]。由于正则表达式具有强大的语言描述能力,正则表达式匹配(regular expression matching)在DPI的场景中有着广泛的应用,是网络内容安全分析的关键技术之一。
正则表达式匹配主要依靠有限状态的自动机完成。有限状态自动机分为两类:一类是非确定型有限自动机(NFA),一类是确定型有限自动机(DFA)。基于NFA的匹配算法预处理时间短,存储空间小,但是线上匹配时间复杂度高。相反,基于DFA的匹配算法只需要扫描一遍待检测文档,具有较高的匹配速度,但是预处理时间长,存储空间大,甚至出现状态爆炸的情况[11]。
预过滤技术可以提高正则表达式匹配速度。其原理是,预过滤的匹配速度比正则表达式匹配速度快。预过滤阶段命中的数据包为可疑数据包,只对可疑数据包进行正则表达式匹配,对于预过滤未命中的数据包,为正常数据包,直接放行,不用进行后期的正则匹配。因此加快了匹配速度。下面介绍预过滤技术。
文献[12]描述了一种MultiStringRE算法。该算法设置一个作为最短匹配长度,然后求出超过该长度的前缀字符串集合S。从S中获得前缀集合prefix(R)(R,正则表达式)作为粗过滤条件。由于正则表达式每次成功的匹配需要从前缀字符串开始,所以每次只需要从prefix(R)命中的位置开始匹配即可,有效地较少了匹配的数据量,因此具有良好的过滤效果。
负因子(Negative Factor)[13]是一定不会出现在匹配文本中的因子,它不仅能过滤掉很多无效的候选区间,还能提前结束自动机的验证过程。基于反向因子的概念。文中提出了一种基于反向因子和前文的必要因子组合的算法PMNS。PMNS指的是包含前缀、后缀、必要因子以及反向因子的匹配方法。例如给定正则表达式“(G|T)A*GA*T*”。首先,计算正则表达式中的必要因子,必要因子是包含在正则表达式中并且一定会出现在匹配结果中的子串,G就是上述正则表达式的一个必要因子。一般来说,一个必要因子可以将正则表达式分为两个部分。因此需要构造两个自动机从两个方向进行验证。同样,文中依次计算了该正则表达式描述的前缀和后缀。PMS算法是使用前缀,后缀和必要因子之后剩余的待检测区间。利用这些反向因子,在PMS算法的基础上,得到PMNS算法,该算法进一步的减少了待检测的区间。在已有过滤方法的基础上,作者给出的基于反向因子的方法发挥出了更好的过滤能力。
文献[14]提出了一种利用关键因子过滤的正则表达式匹配算法。作者发现,对于给定的正则表达式和文本,不同过滤因子的出现频率是不一样的。为了构造给定正则表达式的关键因子,作者提出了一种高效的关键因子构造算法,通过先求得正则表达式的所有划分,再通过划分发现所有有效过滤因子,从而得到关键因子。最后,提出了基于关键因子过滤的具有偏移量的验证方式。最后作者进行了相关实验,表明基于关键因子过滤的匹配方法可以有效的提升正则表达式的匹配性能。
基于前缀的预过滤方法和RegularBNDM算法的缺点在于,随着增大,通常前缀的规模集合呈指数增长,降低匹配的效率。基于负因子的方法也存在缺点,在反向因子冗余以及过度使用的情况下,匹配的性能可能会较大幅度的降低。
针对以上问题,本技术提出了最长子串抽取技术,该技术的时间复杂度低,保证了技术的可实施性;有很高的抽取率,保证了预过滤的效果。因此,该最长精确子串抽取技术改进了预过滤类方案中预过滤的效果,并最终提升正则表达式匹配的速度。
发明内容
本发明的目的是提出一种从正则表达式中抽取最长精确子串的方法,对于大规模复杂的正则表达式,最长子串抽取算法抽取速度快,支持语法多,抽取率高。
为实现上述目的,本发明采用的技术方案是:
一种从正则表达式中抽取最长精确子串的方法,步骤包括:
构造正则表达式的解析树,获得可以进行解析树遍历访问的根节点;
将解析树的CONCAT路径上的CONCAT节点的边都进行切分,把解析树切分成多个子树,每个子树即为一个基本单元,CONCAT路径是指从根节点出发的路径上的节点都是操作符;
新建一个节点作为精确串锚点,用以存储精确串,同时记录该精确串锚点的左右邻居,该精确串为只有单个字符的基本单元或者由连续CONCAT操作符切分的字符拼接而成;
通过对精确串锚点的左邻居和右邻居分别计算后缀和前缀,通过对后缀、精确串、前缀的拼接即可得到基于该精确串锚点抽取的精确子串,再通过对所有精确串锚点的计算,得到最长精确子串。
进一步地,利用最长子串抽取方法获得最长精确子串,该方法为:输入正则表达式r,令L(r)为该正则表达式描述的语言集合,令P为L(r)中每个子串的公共子串集合,则抽取集合P中最长的子串即为最长精确子串。
进一步地,正则表达式的解析树中,每个叶节点为使用Σ∪{ε}中的一个字符来标识,每个中间节点为操作符。
进一步地,操作符包括通配符操作符“·”(匹配任意字符(0-255))、选择操作符“|”(连接的前后字符串都可匹配)、重复操作符“+”(操作符前的字符出现一次或多次)、重复操作符“*”(操作符前的字符出现0次或多次)。
进一步地,计算后缀和前缀的方法如下:
令getPrefix表示节点前缀抽取方法,prefix表示抽取到的前缀,node表示正在被处理的节点,node节点在解析树中有left和right两个孩子节点,则计算前缀的方法包括:
1.case?prefix=NULL,其中?表示0或1个,表示因有不存在的可能,故为NULL;
2.case*prefix=NULL,其中*表示0个或多个,表示因有不存在的可能,故为NULL;
3.case normal_char prefix=normal_char,表示当字符是一确定的字符时,则前缀即为该字符;
4.case+prefix=getPrefix(node.left),其中+表示1个或多个,表示node.left至少重复一次,对node.left递归计算,得到前缀;
5.case[],其中[]表示字符组中的字符,表示如果该字符组只表示一个字符,则抽取该字符,否则为NULL;
6.case{},其中{m,n}表示对前面字符的重复次数最小为m次,最多为n次;则如果有精确串,则提取node.left表示的精确串,并重复m次即为节点表示的前缀子串;
7.case|prefix=common_prefix(node.left,node.right),其中|表示该表达式两边的模式都是满足的,则按照以下步骤处理:
7.1分别递归处理得到左右节点的前缀,prefix_left=getPrefix(node.left),prefix.right=getPrefix(node.right);
7.2 prefix_left和prefix_right为精确串,可通过比对求出该两个精确串的前缀;
8.case prefix=handle_concat(node.left,node.right),按照以下步骤处理:
8.1 node.left表示精确串str,则prefix=node_left+getPrefix(node.right);
8.2 node.left不表示精确串,则prefix=getPrefix(node.right);
计算后缀的方法与计算前缀的方法相同。
一种从正则表达式中抽取最长精确子串的系统,包括存储器和处理器,该存储器存储计算机程序,该程序被配置为由该处理器执行,该程序包括用于执行上述方法中各步骤的指令。
一种存储计算机程序的计算机可读存储介质,该计算机程序包括指令,该指令当由服务器的处理器执行时使得该服务器执行上述方法中的各个步骤。
附图说明
图1是正则表达式AG+(ACT)和(AG|AC)(AG|AT)解析树图。
图2是正则表达式最长子串抽取示例图。
图3是最长子串计算流程图。
图4是抽取时间实验直方图。
图5是抽取比例实验直方图。
图6是各个数据集抽取率和子串长度关系曲线图。
具体实施方式
为使本发明的上述特征和优点能更明显易懂,下文特举实施例,并配合所附图作详细说明如下。
首先,给出正则表达式最长子串抽取技术的形式化描述。
定义1:最长子串抽取技术。输入正则表达式r,令L(r)为该正则表达式描述的语言集合,令P为L(r)中每个子串的公共子串集合,则抽取集合P中最长的子串即为最长子串抽取技术。
解析树是正则表达式在内存中的表现形式,像二叉树、数组等用来组织数据存储的结构一样,正则表达式的解析树为正则表达式的处理和分析奠定了基础。通常来说,解析树并不是唯一的,在解析树中,每个叶节点都是使用Σ∪{ε}中的一个字符来标识,而每个中间节点是操作符,如集合{·,|,*,+,*}中的元素可以对字符进行描述。
对于简单的语法,使用类似Lex这样简单的词法分析器即可,但是正则表达式的语法对于词法分析器来说过于复杂,而对那些完整的自底向上的解析器来说又过于简单。因此好的方法是,根据自己的需求,自己构造一个语法解析器。
如图1,给出正则表达式AG+(ACT)和(AG|AC)(AG|AT)的解析树,其中每个运算符节点有1个或2个子节点,如图中,{+}等节点是一个子节点,用来描述该子节点的数量,{·,|}等有2个子节点,用来描述两个子节点之间的关系。同时解析树表示法具有唯一可逆性,即给出一个解析树和其根节点,只能逆推得到一个正则表达式。
正则表达式的解析树并不是唯一的,由于构建方法不同,解析树的形式也有所不同。构建解析树算法的逻辑是通过对不同的运算符进行分类并构建相应的解析树,并按照运算符的优先级递归处理表达式逻辑。伪代码中,通过while循环从左向右处理正则表达式,循环内对字符是普通字符、并集操作符|、闭包操作符*、优先级限定符()几种情况分别处理。
定义2:基本单元。利用语法解析树,将正则表达式R分解为基本的连接单元,R=A1A2A3…Ak,每个连接单元不可再分,其中Ai(1≤i≤k)称为基本单元。
定义3:CONCAT路径。在语法解析树上,从根节点出发,路径上的节点都是CONCAT连接操作符,则该路径成为CONCAT路径。
最长子串是正则表达式中必要因子的最长字符串。必要因子是正则表达式所描述的语言中公共子串。以正则表达式R=ABC+(D|E)F为例,该正则表达式描述的语言有L(R)={ABCDF,ABCEF,ABCCDF,ABCCEF…},这个正则表达式描述的语言是无限的,但是必定会出现的因子是{ABC,F},因此最长子串MaxStr=ABC。如图2列出了其他几种常见操作符的最长字符串抽取示例。其中R表示正则表达式,L(R)表示正则表达式描述的语言集,MaxStr表示该正则表达式抽取的最长子串。
最长子串抽取算法的主要思路如下描述。首先由正则表达式构造语法解析树,然后将解析树分解成多个基本单元,选中精确子串的基本单元作为锚点,分别计算该锚点的前缀和后缀,对每个锚点同样的处理得到多个精确子串,如图3所示,具体如下。
第一步是构造正则表达式的解析树,采用上节的算法框架,根据正则表达式的复杂性,设计实现相应的解析树构造程序,将解析得到的解析树存放在内存中,并返回可以进行解析树遍历访问的根节点。
第二步是CONCAT切分法。如图3中虚线分割的边即为CONCAT路径上的边。将CONCAT路径上的CONCAT节点的边都进行切分。这样,就可以把原解析树切分成多个子树,每个子树即为一个基本单元。以上是从解析树的角度进行分析,如果从正则表达式的角度来看,即选择最外层的CONCAT操作符作为切分符,将原正则表达式分解为多个小型的正则表达式的组合。
第三步是构造精确串锚点。只有单个字符的基本单元是精确串,同时对于由连续CONCAT操作符切分的字符可以拼接成为精确串。同时新建一个节点,该节点存储精确串,同时记录该精确串节点的左右邻居,该节点即为精确串锚点。
第四步是计算精确串锚点的前缀和后缀子串。通过对精确串锚点的左邻居计算后缀,对精确串锚点的右邻居计算前缀,通过对后缀、精确串、前缀的拼接即可得到基于该精确串锚点抽取的精确子串。最后通过对所有精确串锚点的计算,得到最长子串即为该正则表达式的最长子串。
对于第四步中精确串锚点的前缀和后缀计算是该算法中的重点。前缀和后缀的计算方法类似。下面详细描述前缀抽取算法。前缀处理方法主要是针对不同的节点类型分情况进行处理。下面从{?,*,+,[],|,{},·}进行讨其前缀的计算。令getPrefix表示该节点前缀抽取方法。prefix表示抽取到的前缀。node表示正在被处理的节点。在解析树中,node节点有left和right两个孩子节点。
1.case?prefix=NULL。说明如下,?表示0或1个,有不存在的可能,所以为NULL。
2.case*prefix=NULL。说明如下,*表示0个或多个,有不存在的可能,所以为NULL。
3.case normal_char prefix=normal_char。当该字符是一个确定的字符时候,前缀就是该字符。
4.case+prefix=getPrefix(node.left)。+表示1个或多个,表示node.left至少重复一次,这种情况下,对node.left递归计算,得到前缀即为该节点表示的前缀。
5.case[]。这种情况下,[]表示的是字符组中的字符。如果该字符组只表示一个字符,则抽取该字符。如果不是,则为NULL。
6.case{}。{m,n}表示对前面字符的重复次数最小为m次,最多为n次。在这种情况下,提取node.left表示的精确串(如果有的话),并重复m次即为该节点表示的前缀子串。
7.case|prefix=common_prefix(node.left,node.right)。|表示该表达式两边的模式都是满足的。该种情况按照下面步骤处理:
7.1分别递归处理得到左右节点的前缀,prefix_left=getPrefix(node.left),prefix.right=getPrefix(node.right)。
7.2 prefix_left和prefix_right为精确串,此时可以通过比对求出这两个精确串的前缀。
8.case prefix=handle_concat(node.left,node.right)。该种情况需要按照如下流程处理:
8.1 node.left表示精确串str,则prefix=node_left+getPrefix(node.right);
8.2 node.left不表示精确串,则prefix=getPrefix(node.right)。
其中,在计算后缀时,8中的left和right修改为:“8.1node.right表示精确串str,则suffix=node_right+getSuffix(node.left);8.2node.right不表示精确串,则suffix=getSuffix(node.right)。”其他的,prefix改为suffix,getPrefix改为getSuffix,前缀改为后缀即可。
算法流程举例:
下面给出该算法运行的一个实际的例子。以正则表达式(A*G)+(TCA)(TA|TC?)为例,最长子串抽取算法的主要思路如图3所示。
1.构造解析树,如图3中的1所示,正则表达式的解析树并不是唯一的,由于构建方法不同,解析树的形式也有所不同。通用逻辑是通过对不同的运算符进行分类并构建相应的解析树,并按照运算符的优先级递归处理表达式逻辑。可以参考文献[15]中的构造方法。
2.CONCAT切分方法,从根节点的CONCAT符号开始,沿着CONCAT组成的路径进行切分。如图3中的2所示,经过切分得到了5个部分。分别是(A*G)+、T、C、A、(TA|TC?)。
3.构造精确串的锚点,按照前面描述,精确串锚点需要保存该锚点表示的精确串,以及该节点在步骤2切分后得到的左右子树。精确串锚点的数据结构设计如下(C++描述)。其中exact_str_node是的精确串锚点,parse_tree_node_t是解析树节点。
对于步骤2中得到的五个部分,得到精确串T、C、A,将相邻的精确串拼接得到TCA,同时记录该锚点的左右孩子,其中左孩子是(A*G)+表示的解析树,右孩子是(TA|TC?)表示的解析树。
4.计算前缀和后缀。
4.1先计算左孩子(A*G)+的后缀,后缀的算法与前缀的算法类似。根据前文所述,(A*G)+对应解析树的根节点是+,根据上文case 4,getPrefix((A*G)+)=getPrefix((A*G))。对于CONCAT符号,根据上文case 8,先判定其左孩子节点A*,根据case 2,该节点为NULL,根据case8.b,计算右孩子,得到G。
4.2再计算右孩子(TA|TC?)的前缀。根节点表示|,由case 7,分别处理该节点的左右孩子。左孩子表示TA,右孩子表示TC?,由case 1,?修饰的节点表示的精确串为NULL。因此右孩子表示的是T。根据case 7可知,计算精确串TA和T的common_prefix,易知为T。
由上计算,计算得到了TCA精确串以及它的前缀G和后缀T,因此得到了子串GTCAT。该子串为最长子串。由于的算法会对每一个能够被抽取出的子串进行长度比较,因此最后得到了该正则表达式的最长子串。
性能测试:
为了测试本文提出的子串抽取方法和基于子串抽取的预过滤技术,本文在多个规则集上进行了性能测试。其中random是随机生成的规则集,competition是来自于某个正则表达式匹配竞赛的数据集,bro、clamav、http、l7、snort是常用的正则表达式规则数据集。
环境配置:实验代码均采用C++实现,实验环境是Intel 3.60GHz Quad Core CPUi7,12G RAM。
子串的抽取性能对整个预过滤系统性能有着直接的影响。抽取算法的性能包含两个方面,一是抽取算法的复杂性,二是子串的抽取率。该实验共对七个数据集进行测试,由图4可知,规则集中的单个正则表达式抽取时间在10ms级别,大部分的抽取时间小于10ms。规则集clamav和l7由于复杂规则的存在,导致算法多次迭代计算,故时间稍多,但是依然小于90ms。即对于大规模的复杂规则集,预处理时间也在较优的范围内。
同样对上述七个规则集进行抽取率的测试。由图5可知,6/7的规则集抽取率都高于90%,甚至有4/7到99%,高比例的子串抽取比例为后期的预过滤引擎设计实现提供了支持。
易知,抽取的子串越长,用来进行预过滤的效果就越好,但是从正则表达式中抽取子串就越难。一方面原因是正则表达式中并没有要求长度的子串,另一方面原因是对抽取算法的要求更高。所以,有必要观察抽取率和子串长度的关系。
改变抽取子串的长度,观察随着抽取长度的变化,抽取率的变化情况。如图6是bro、clamav、l7、competition、http、random、snort数据集的抽取率随着抽取子串长度变化的关系。其中横轴是子串的长度,纵轴是抽取率,七个曲线分别代表七个数据集。在子串长度小于5的时候,有6/7的数据集的抽取率基本保持不变,说明在可以抽取出子串的情况下,该子串抽取算法随着子串长度的增加,依然保持较高的抽取率。
引用文献:
[1]褚衍杰,李云照,魏强.一种改进的多模式匹配算法[J].西安电子科技大学学报(自然科学版),2014,41(6):174-180.
[2]赵毅,朱鹏,迟学斌,等.浅析高性能计算应用的需求与发展[J].计算机研究与发展,2007,44(10):1640-1646.
[3]M.Finsterbusch,C.Richter,E.Rocha,J.-A.Muller,and K.Hanssgen,“Asurvey of payload-based traffic classification approaches,”IEEECommun.Surveys Tuts.,vol.16,no.2,pp.1135–1156,2nd Quart.2014.
[4]P.-C.Lin,Z.-X.Li,Y.-D.Lin,Y.-C.Lai,and F.C.Lin,“Profilingandaccelerating string matching algorithms in three network content securityapplications,”IEEE Commun.Surveys Tuts.,vol.8,no.2,pp.24–36,2nd Quart.2006.
[5]T.AbuHmed,A.Mohaisen,and D.Nyang,“Deep packet inspection forintrusion detection systems:A survey,”Korea Commun.Soc.(Inf.Commun.),vol.24,no.11,pp.25–36,2007.
[6]P.M.Rathod,N.Marathe,and A.V.Vidhate,“A survey on finite automatabased pattern matching techniques for network intrusion detection system(NIDS),”in Proc.Int.Conf.Adv.Electron.Comput.Commun.(ICAECC),Bengaluru,India,2014,pp.1–5.
[7]V.Paxson.Bro:A system for detecting network intruders in real-time.Computer networks,31(23):2435–2463,1999.
[8]T.J.Green,A.Gupta,G.Miklau,M.Onizuka,and D.Suciu.Processing XMLStreams with Deterministic Automata and Stream Indexes.ACM Transactions onDatabase Systems(TODS),29(4):752–788,2004.
[9]Y.Diao,M.Altinel,M.J.Franklin,H.Zhang,and P.Fischer.Path Sharingand Predicate Evaluation for High-performance XML Filtering.ACM Transactionson Database Systems(TODS),28(4):467–516,2003.
[10]Roesch and Martin.Snort-Lightweight Intrusion Detection forNetworks.In Proc.USENIX LISA,pages229–238,1999.
[11]F.Yu,Z.Chen,Y.Diao,T.V.Lakshman,and R.H.Katz,“Fast and memory-efficient regular expression matching for deep packet inspection,”inProc.ACM/IEEE Symp.Archit.Netw.Commun.Syst.,San Jose,CA,USA,2006,pp.93–102.
[12]B.Watson.A New Regular Grammar Pattern MatchingAlgorithm.Algorithms―ESA’96,pages 364–377,1996.
[13]Yang X,Qiu T,Wang B,et al.Negative Factor:Improving Regular-Expression Matching in Strings[J].ACM Transactions on Database Systems,2016,40(4).
[14]邱涛,王斌,杨晓春.利用关键因子过滤的正则表达式匹配算法[J].计算机科学与探索,2016,10(3):326-337.
[15]纳瓦罗.柔性字符串匹配[M].电子工业出版社,2007.
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。
Claims (7)
1.一种从正则表达式中抽取最长精确子串的方法,步骤包括:
构造正则表达式的解析树,获得可以进行解析树遍历访问的根节点;
将解析树的CONCAT路径上的CONCAT节点的边都进行切分,把解析树切分成多个子树,每个子树即为一个基本单元,CONCAT路径是指从根节点出发的路径上的节点都是操作符;
新建一个节点作为精确串锚点,用以存储精确串,同时记录该精确串锚点的左右邻居,该精确串为只有单个字符的基本单元或者由连续CONCAT操作符切分的字符拼接而成;
通过对精确串锚点的左邻居和右邻居分别计算后缀和前缀,通过对后缀、精确串、前缀的拼接即可得到基于该精确串锚点抽取的精确子串,再通过对所有精确串锚点的计算,得到最长精确子串。
2.如权利要求1所述的方法,其特征在于,利用最长子串抽取方法获得最长精确子串,该方法为:输入正则表达式r,令L(r)为该正则表达式描述的语言集合,令P为L(r)中每个子串的公共子串集合,则抽取集合P中最长的子串即为最长精确子串。
3.如权利要求1所述的方法,其特征在于,正则表达式的解析树中,每个叶节点为使用∑∪{ε}中的一个字符来标识,每个中间节点为操作符。
4.如权利要求1或3所述的方法,其特征在于,操作符包括通配符操作符“·”、选择操作符“|”、重复操作符“+”、重复操作符“*”。
5.如权利要求1所述的方法,其特征在于,计算后缀和前缀的方法如下:
令getPrefix表示节点前缀抽取方法,prefix表示抽取到的前缀,node表示正在被处理的节点,node节点在解析树中有left和right两个孩子节点,则计算前缀的方法包括:
1.case?prefix=NULL,其中?表示0或1个,表示因有不存在的可能,故为NULL;
2.case*prefix=NULL,其中*表示0个或多个,表示因有不存在的可能,故为NULL;
3.case normal_char prefix=normal_char,表示当字符是一确定的字符时,则前缀即为该字符;
4.case+prefix=getPrefix(node.left),其中+表示1个或多个,表示node.left至少重复一次,对node.left递归计算,得到前缀;
5.case[],其中[]表示字符组中的字符,表示如果该字符组只表示一个字符,则抽取该字符,否则为NULL;
6.case{},其中{m,n}表示对前面字符的重复次数最小为m次,最多为n次;则如果有精确串,则提取node.left表示的精确串,并重复m次即为节点表示的前缀子串;
7.case|prefix=common_prefix(node.left,node.right),其中|表示该表达式两边的模式都是满足的,则按照以下步骤处理:
7.1分别递归处理得到左右节点的前缀,prefix_left=getPrefix(node.left),prefix.right=getPrefix(node.right);
7.2prefix_left和prefix_right为精确串,可通过比对求出该两个精确串的前缀;
8.case prefix=handle_concat(node.left,node.right),按照以下步骤处理:
8.1node.left表示精确串str,则prefix=node_left+getPrefix(node.right);
8.2node.left不表示精确串,则prefix=getPrefix(node.right);
计算后缀的方法与计算前缀同理,只需将prefix修改为suffix,getPrefix修改为getSuffix,前缀修改为后缀,将8中的left和right互换,即“8.1node.right表示精确串str,则suffix=node_right+getSuffix(node.left);8.2node.right不表示精确串,则suffix=getSuffix(node.right)”。
6.一种从正则表达式中抽取最长精确子串的系统,包括存储器和处理器,该存储器存储计算机程序,该程序被配置为由该处理器执行,该程序包括用于执行上述权利要求1-5任一所述的方法中各步骤的指令。
7.一种存储计算机程序的计算机可读存储介质,该计算机程序包括指令,该指令当由服务器的处理器执行时使得该服务器执行上述权利要求1-5任一所述的方法中的各个步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910116717.5A CN109977298B (zh) | 2019-02-15 | 2019-02-15 | 一种从正则表达式中抽取最长精确子串的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910116717.5A CN109977298B (zh) | 2019-02-15 | 2019-02-15 | 一种从正则表达式中抽取最长精确子串的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109977298A true CN109977298A (zh) | 2019-07-05 |
CN109977298B CN109977298B (zh) | 2021-07-23 |
Family
ID=67076945
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910116717.5A Active CN109977298B (zh) | 2019-02-15 | 2019-02-15 | 一种从正则表达式中抽取最长精确子串的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109977298B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113268246A (zh) * | 2021-05-28 | 2021-08-17 | 大箴(杭州)科技有限公司 | 正则表达式的生成方法、装置及计算机设备 |
CN115796166A (zh) * | 2023-02-06 | 2023-03-14 | 华侨大学 | 一种智慧物流控制系统的正则表达式测试方法和系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070133593A1 (en) * | 2005-11-21 | 2007-06-14 | Udaya Shankara | Searching Strings Representing a Regular Expression |
CN101201836A (zh) * | 2007-09-04 | 2008-06-18 | 浙江大学 | 基于带记忆确定有限自动机的正则表达式匹配加速方法 |
CN102184197A (zh) * | 2011-04-22 | 2011-09-14 | 湖南亿谷信息科技发展有限公司 | 基于智能有限自动机的正则表达式匹配方法 |
CN106021392A (zh) * | 2016-05-12 | 2016-10-12 | 中国互联网络信息中心 | 一种新闻关键信息的提取方法及系统 |
US20180188968A1 (en) * | 2017-01-04 | 2018-07-05 | Samsung Electronics Co., Ltd. | Memory apparatus for in-place regular expression search |
-
2019
- 2019-02-15 CN CN201910116717.5A patent/CN109977298B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070133593A1 (en) * | 2005-11-21 | 2007-06-14 | Udaya Shankara | Searching Strings Representing a Regular Expression |
CN101201836A (zh) * | 2007-09-04 | 2008-06-18 | 浙江大学 | 基于带记忆确定有限自动机的正则表达式匹配加速方法 |
CN102184197A (zh) * | 2011-04-22 | 2011-09-14 | 湖南亿谷信息科技发展有限公司 | 基于智能有限自动机的正则表达式匹配方法 |
CN106021392A (zh) * | 2016-05-12 | 2016-10-12 | 中国互联网络信息中心 | 一种新闻关键信息的提取方法及系统 |
US20180188968A1 (en) * | 2017-01-04 | 2018-07-05 | Samsung Electronics Co., Ltd. | Memory apparatus for in-place regular expression search |
Non-Patent Citations (1)
Title |
---|
邱涛 等: "利用关键因子过滤的正则表达式匹配算法", 《计算机科学与探索》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113268246A (zh) * | 2021-05-28 | 2021-08-17 | 大箴(杭州)科技有限公司 | 正则表达式的生成方法、装置及计算机设备 |
CN115796166A (zh) * | 2023-02-06 | 2023-03-14 | 华侨大学 | 一种智慧物流控制系统的正则表达式测试方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109977298B (zh) | 2021-07-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106131071B (zh) | 一种Web异常检测方法和装置 | |
Min et al. | TR‐IDS: Anomaly‐based intrusion detection through text‐convolutional neural network and random forest | |
CN107292170B (zh) | Sql注入攻击的检测方法及装置、系统 | |
US10115061B2 (en) | Motif recognition | |
CN108920954B (zh) | 一种恶意代码自动化检测平台及方法 | |
CN114172701A (zh) | 基于知识图谱的apt攻击检测方法及装置 | |
US20150095359A1 (en) | Volume Reducing Classifier | |
CN109005145A (zh) | 一种基于自动特征抽取的恶意url检测系统及其方法 | |
CN107426049A (zh) | 一种网络流量精确检测方法、设备及存储介质 | |
CN113194058B (zh) | Web攻击检测方法、设备、网站应用层防火墙及介质 | |
US11888874B2 (en) | Label guided unsupervised learning based network-level application signature generation | |
CN112989348B (zh) | 攻击检测方法、模型训练方法、装置、服务器及存储介质 | |
CN110191096A (zh) | 一种基于语义分析的词向量网页入侵检测方法 | |
CN112199677A (zh) | 一种数据处理方法和装置 | |
Wurzenberger et al. | Aecid-pg: A tree-based log parser generator to enable log analysis | |
CN109977298A (zh) | 一种从正则表达式中抽取最长精确子串的方法 | |
CN107209834A (zh) | 恶意通信模式提取装置、恶意通信模式提取系统、恶意通信模式提取方法及恶意通信模式提取程序 | |
CN103324886A (zh) | 一种网络攻击检测中指纹库的提取方法和系统 | |
US9600644B2 (en) | Method, a computer program and apparatus for analyzing symbols in a computer | |
Qi et al. | An end-to-end detection method for webshell with deep learning | |
CN108647497A (zh) | 一种基于特征提取的api密钥自动识别系统 | |
US20230353595A1 (en) | Content-based deep learning for inline phishing detection | |
CN115392238A (zh) | 一种设备识别方法、装置、设备及可读存储介质 | |
Werner et al. | Nebula-generating syntactical network intrusion signatures | |
CN113645222A (zh) | 报文流量检测方法、系统、装置及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |