CN114896469A - 一种正则表达式引擎的构造方法、装置、存储介质及设备 - Google Patents

一种正则表达式引擎的构造方法、装置、存储介质及设备 Download PDF

Info

Publication number
CN114896469A
CN114896469A CN202210476217.4A CN202210476217A CN114896469A CN 114896469 A CN114896469 A CN 114896469A CN 202210476217 A CN202210476217 A CN 202210476217A CN 114896469 A CN114896469 A CN 114896469A
Authority
CN
China
Prior art keywords
jump
state
character
nfa
regular expression
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.)
Pending
Application number
CN202210476217.4A
Other languages
English (en)
Inventor
王彬
马云雷
顾汉杰
范阿冬
屈岳
王桢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alibaba China Co Ltd
Original Assignee
Alibaba China Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Alibaba China Co Ltd filed Critical Alibaba China Co Ltd
Priority to CN202210476217.4A priority Critical patent/CN114896469A/zh
Publication of CN114896469A publication Critical patent/CN114896469A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/903Querying
    • G06F16/90335Query processing
    • G06F16/90344Query processing by using string matching techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/955Retrieval from the web using information identifiers, e.g. uniform resource locators [URL]

Landscapes

  • Engineering & Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本说明书实施例提供一种正则表达式引擎的构造方法、装置、存储介质及设备,所述方法包括:遍历正则表达式的各个字符,将所述正则表达式中连续的普通字符标记为连续字符串;基于所述正则表达式构造初始非确定有穷自动机,其中,将标记为所述连续字符串的字符对应的NFA状态跳转关系合并为同一个NFA状态跳转关系。本说明书实施例在构造NFA时,通过将标记为连续字符串的连续的普通字符标对应的跳转关系合并为同一个跳转关系,减少了不必要的状态数量和跳转关系的数量,因此,与现有的NFA构造方法相比,本说明书实施例的方法构造出的NFA执行效率更高,其构造过程中消耗的计算资源也比较低。

Description

一种正则表达式引擎的构造方法、装置、存储介质及设备
技术领域
本说明书实施例涉及计算机技术领域,尤其涉及一种正则表达式引擎的构造方法、装置、存储介质及设备。
背景技术
现有技术中,正则表达式引擎一般分为NFA(非确定有穷自动机,Non-deterministic finite automaton)和DFA(确定有穷自动机,Deterministic finiteautomaton)两类。一般来说,NFA是依次遍历正则表达式字符串中的各个字符后构造出来的,NFA中的状态数量与正则表达式字符串的长度成正比。而DFA则是在NFA的基础上转换生成的。与NFA相比,由于DFA中对于输入的每一个字符,其对应的结果是确定的,因此DFA一般处理速度比较快,但是,由于DFA是在NFA的基础上转换生成的,需要遍历NFA的所有活动状态集合,因此,DFA的空间复杂度极高,特别是,当正则表达式字符串比较复杂,或长度较长时,DFA的执行效率会受到极大的影响,因此,大部分使用DFA的正则表达式引擎均设置有错误回退NFA的自我保护机制。
在正则表达式中,字符可以分为普通字符和特殊字符(或称“元字符”)两种,其中,普通字符可以是字母(例如小写字母a-z中的任意一个,或者大写字母A-Z中的任意一个)、数字(例如0-9中的任意一个)、汉字或除了特殊字符外的其他字符,而特殊字符则包括\、^、$、*、+等。正则表达式中的普通字符用于和字符串匹配,而特殊字符则表述特殊的匹配行为,例如,*表述匹配前面的子表达式零次或多次。
在正则表达式中,如果出现连续的普通字符,不管是NFA,还是由NFA转换生成的DFA,其在该连续的普通字符组成的子表达式前后的状态一般都不会受到子表达式中的任意普通字符的影响,然而,现有的正则表达式引擎中,不管是使用NFA,还是使用DFA,对于连续的普通字符,都是一个字符一个字符的遍历的,每多一个字符就多一个状态,导致状态数量较高,以至于正则表达式引擎的执行效率比较低,计算资源也比较高。
发明内容
为克服相关技术中存在的问题,本说明书实施例提供一种正则表达式引擎的构造方法、装置、存储介质及设备,用以解决相关技术中的缺陷。
根据本说明书实施例的第一方面,提供一种正则表达式引擎的构造方法,所述方法包括:
遍历正则表达式的各个字符,将所述正则表达式中连续的普通字符标记为连续字符串;
基于所述正则表达式构造初始非确定有穷自动机,其中,将标记为所述连续字符串的字符对应的NFA状态跳转关系合并为同一个NFA状态跳转关系。
根据本说明书实施例的第二方面,提供一种正则表达式引擎的构造装置,所述装置包括:
字符识别模块,用于遍历正则表达式的各个字符,将所述正则表达式中连续的普通字符标记为连续字符串;
引擎构造模块,用于基于所述正则表达式构造初始非确定有穷自动机,其中,将标记为所述连续字符串的字符对应的NFA状态跳转关系合并为同一个NFA状态跳转关系。
根据本说明书实施例的第三方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现上述任意实施例所述的方法。
根据本说明书实施例的第四方面,提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任意实施例所述的方法。
在上述技术方案中,本说明书实施例在构造NFA时,通过将标记为连续字符串的连续的普通字符标对应的跳转关系合并为同一个跳转关系,减少了不必要的状态数量和跳转关系的数量,因此,与现有的NFA构造方法相比,本说明书实施例的方法构造出的NFA执行效率更高,其构造过程中消耗的计算资源也比较低。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本说明书实施例。
附图说明
图1是本说明书实施例示出的一种正则表达式引擎的构造方法的流程图。
图2是本说明书实施例示出的一种基于正则表达式“a*bcc”构造的传统的NFA的状态图。
图3是本说明书实施例示出的一种基于正则表达式“a*bcc”构造的init-NFA的状态图。
图4是本说明书实施例示出的一种构造正则表达式引擎的流程示意图。
图5是本说明书实施例示出的一种正则表达式引擎的构造装置的框图。
图6是本说明书实施例示出的一种计算设备硬件的结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书实施例的一些方面相一致的装置和方法的例子。
在本说明书实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书实施例。在本说明书实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
正则表达式(Regular Expression)是一种用于描述一组字符串特征的文本模式,可以用来匹配特定的字符串。在很多技术领域,例如,自然语言处理,数据存储等,通过文本模式的匹配,正则表达式可以很方便的提取目标信息。正则表达式可以对具有特定格式的文本进行验证,筛选不满足预定格式的文本对象,例如,网站的用户名和密码一般都具有特定的格式,而正则表达式可以用于在表单提交时,进行用户名密码的验证。正则表达式还可以通过预设的条件匹配指定的文本,能够从大量信息中快速提取指定内容,例如,从一批URL(Uniform Resource Locator,统一资源定位器)中查找指定的URL。正则表达式还可以通过匹配查找指定格式的文本,在找到指定格式的文本后再进行特定的文本替换。由于正则表达式对带格式文本的处理具有快速且准确的效果,正则表达式目前被集成到了各种文本编辑器和文本处理工具当中。
一般来说,正则表达式是通过普通字符和特殊字符来进行模式描述,从而达到文本匹配的目的。
正则表达式中的普通字符由所有未显式指定为特殊字符的打印和非打印字符组成。其中包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。表达式中的普通字符,在匹配一个字符串的时候,用于匹配与之相同的一个字符。最简单的正则表达式是一个单独的普通字符,可以匹配目标字符串中的该字符本身。例如,单字符模式“a”可以匹配目标字符串中任何位置出现的字母“a”。而将多个单独的普通字符组合在一起,可以得到一个较大的表达式,其可以匹配目标字符串中的该表达式本身。值得注意的是,正则表达式中连续的多个普通字符在目标字符串中的匹配结果也是连续的多个普通字符,而且匹配结果中各个字符的排列顺序与正则表达式中各个字符的排列顺序保持一致。例如,多字符模式“abc”可以匹配目标字符串中任意出现的子字符串“abc”,而且,目标字符串中匹配到的子字符串“abc”的三个字母也是连续的,而不是分散的。而且,目标字符串中匹配到的子字符串应该是满足“abc”的排列顺序的子字符串,而不是其他排列顺序,例如“acb”,的子字符串。
而正则表达式中的特殊字符,或称元字符,可以使正则表达式具有处理能力。特殊字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于特殊字符前面的字符)在目标字符串中的出现模式。例如,元字符*用来匹配0个或多个的前导字符;而元字符.用来匹配除换行符外的一个任意的一个字符。较为常用的元字符包括:“+”,“*”,以及“?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
在本领域中,实现正则表达式的匹配功能的工具称为正则表达式引擎,正则表达式引擎能够接收和识别一个给定的正则表达式,并基于该正则表达式编译生成一个识别装置,而当任意字符串需要和该正则表达式匹配时,只需要将该字符串输入该识别装置,该识别装置即可输出对应的匹配结果,即该字符串是否能和该正则表达式匹配。现有的正则表达式引擎中,一般都是使用有穷自动机(Finite Automata,FA)作为识别装置的。有穷自动机是一个识别器,它由一系列它可以对每个输入的字符做识别和判断,以确定其能到达的最终状态或状态集和路径。有穷自动机可以分为两类,即确定有穷自动机(DeterministicFinite Automata,DFA)和非确定有穷自动机(Nondeterministic Finite Automata,NFA),即正则表达式引擎也可以分为两类,DFA引擎和NFA引擎。
一个有穷自动机(其可以是DFA,也可以是NFA)包含五个部分,其分别是:有限状态集、字符表、转换函数、一个初始状态和一个或多个结束状态。其中,有限状态集包含有限个状态,用于表示该有限自动机中从初始状态到所有结束状态之间所有可能出现的状态,而状态可以认为是正则表达式匹配过程中可能出现的任意一个子表达式,例如,若一个正则表达式为“abcc”,则基于该正则表达式生成的有穷自动机中的有限状态集则可以表示为{S0,S1,S2,S3,S4},其中,S0,S1,S2,S3和S4分别对应表达式为I,“a”,“ab”,“abc”和“abcc”的状态,其中I表示初始状态,即未包含任意字符的状态,需要注意的是,两个不同的状态对应的表达式可能是相同的。字符表则是正则表达式中所有输入符号的有限集合,例如,在上述正则表达式为“abcc”的例子中,字符表即为{a,b,c},需要注意的是,字符表中记录的输入符号只包括正则表达式中的普通字符,而不包括正则表达式中的特殊字符,例如正则表达式为“ab|c”的有穷自动机中的符号表是{a,b,c},其中不包括特殊字符“|”,事实上,正则表达式中的特殊字符在构造有穷自动机的过程中不作为输入字符,而是用于确定各个状态之间的跳转关系。转换函数则是用于表示某一个状态输入指定的输入字符后会跳转至指定的后继状态的跳转关系,例如,在上述正则表达式为“abcc”的例子中,其中的一个转换函数为:S0×a→S1,表示状态S0在输入字符a后会跳转至状态S1,上述例子中还存在其他的转换函数,本说明书实施例不一一赘述。初始状态则是指有穷自动机未输入任意字符前的状态,该状态中不包含任何字符,例如,在上述正则表达式为“abcc”的例子中,初始状态为S0,即I。结束状态则是指该有穷自动机中所有能够和该正则表达式相匹配的状态,当任意匹配过程中到达结束状态时,即可以认为当次输入的字符串与该正则表达式匹配,例如,在上述正则表达式为“abcc”的例子中,结束状态为S4,即“abcc”。一般来说,有穷自动机中的初始状态只有一个,而结束状态则可以有一个或多个,即从同一个起点出发,通过不同的路径,都有可能达到匹配该正则表达式的终点。
NFA与DFA的区别在于,NFA中的状态转换函数是多值函数,即对于一个输入字符,NFA可能跳转至两种或两种以上的后继状态,即NFA的跳转结果是不确定的;而DFA中的状态转换函数则是单值函数,对于任意一个输入字符,DFA跳转后的后继状态都是唯一的,即DFA的跳转结果是确定的。由于NFA的跳转结果是不确定的,因此NFA中的每一次跳转均可以视为在所有可能的跳转中做一次选择,而选择的结果可能是错误的,所以NFA中引入了回溯的机制,允许在跳转后的后继状态匹配不到后续的输入字符时,可以回退到跳转前的状态,再在所有可能的跳转中选择另一个跳转途径,而如果所有可能的跳转都尝试过后也无法匹配到后续的输入字符时,可以进一步回退到更前的状态,选择其他的途径进行匹配,直到匹配到正确的结果,或者遍历所有可能性也无法继续匹配时宣告错误的结果。而在DFA中,每一次匹配都是确定的结果,因此,DFA中匹配的路径是单一的,当DFA达到某一状态而无法继续匹配时,即可宣告当次的字符串匹配失败。显然,在运行的过程中,由于不需要回溯各种可能性,DFA引擎的处理速度会比NFA引擎的处理速度快得多。但是,在解析正则表达式时,NFA引擎可以直接进行编译,而DFA引擎为了确定每一次跳转的结果唯一,DFA引擎除了编译外,还需要遍历出正则表达式中所有可能的结果,因此,在编译的过程中,NFA引擎的处理速度则比DFA引擎的处理速度快得多。
不管是NFA引擎还是DFA引擎,在编译正则表达式的过程中,都是以一个字符对应一个状态进行编译的,因此,当正则表达式越复杂,即正则表达式中的字符数量越多时,基于该正则表达式构造生成的NFA或DFA的状态数量也就越多,同样地,在匹配过程中的状态跳转的次数也就越多。而在状态跳转的过程中,需要调用一定的函数库进行字符集的转换,将输入字符转换为字节格式进行处理,因此,每一次状态跳转均需要消耗一定的计算资源。因此,当状态数量较多,状态跳转过程较多时,正则表达式引擎的执行效率就会越低,其执行过程中消耗的计算资源也就越高。
对此,本说明书实施例提出了一种正则表达式引擎的构造方法,可以有效地减少状态数量和匹配过程中状态跳转地次数,大大的提高正则表达式引擎的执行效率,而且消耗的计算资源更少。
如图1所示,图1时本说明书实施例根据一实施例示出的一种正则表达式引擎的构造方法的流程图,包括以下步骤:
步骤S101,遍历正则表达式的各个字符,将正则表达式中连续的普通字符标记为连续字符串;
步骤S103,基于正则表达式构造初始非确定有穷自动机,将标记为连续字符串的字符对应的跳转关系合并为同一个跳转关系。
在步骤S101中,在构造有穷自动机前,需要将正则表达式中的所有连续普通字符标记出来。
其中,普通字符是指正则表达式中除了特殊字符以外的所有字符,例如,大写的字母字符A-Z中的任意一个、小写的字母字符a-z中的任意一个、数字字符0-9中的任意一个、标点符号字符(例如“,”、“;”、“。”等)以及一些特殊的符号,另外,汉字字符也属于普通字符。而相对的,正则表达式中的特殊字符则主要包括“$”、“(”、“)”、“*”、“+”、“.”、“[”、“?”、“\”、“^”、“{”以及“|”等。
其中,连续的普通字符则是指前后连续的几个字符均属于普通字符,中间不包含任意特殊字符,而连续的普通字符可以添加相同的连续字符串标记,而具有相同的连续字符串标记的连续的普通字符可以组成一个连续字符串,以表明这些普通字符存在连续的前后顺序关系。在一个正则表达式中,可能存在多个连续字符串,而各个连续字符串之间不存在直接的关系。例如,“adcd”的整个字符串可以被识别为连续字符串,而“ab|cd”的整个字符串则不能被识别连续字符串,需要分别将“ab”和“cd”提取出来,各自标记不同的连续字符串标记,形成两个不同的连续字符串。
在一些实施例中,在正则表达式中识别出来的连续字符串应当是能识别出来的最长的连续字符串,即应尽最可能的扩大连续字符串的长度,从而最大限度的减少状态数量和状态跳转次数,提高执行效率。例如,一个正则表达式为“abcde”,则其识别出来的连续字符串也应当为“abcde”,而不是“abcd”或“bcde”,以使得连续字符串的长度为可能识别出来的最大长度。
在一些实施例中,在正则表达式中的连续的普通字符在匹配时,其中的各个普通字符之间都是直接的连接关系,而且位于连续字符串中的字符也不会和连续字符串外的字符形成其他的操作关系,即连续字符串内地状态跳转关系是确定的,而且不会受到正则表达式中连续字符串之外的其他子表达式的影响,因此,在构造NFA时,可以将标记为连续字符串的字符对应的跳转关系合并为同一个跳转关系,而不影响NFA中的其他跳转关系,而且其构造成的NFA的结果也不会受到跳转关系合并的影响。
值得注意的是,在一些实施例中,在正则表达式中存在成对的中括号,即“[”和“]”符号,且中括号的任意一边的字符的前一个字符均不是转义字符“\”时,表示该正则表达式中由中括号包括起来的整个子字符串,用于匹配中括号中的任意一个字符,因此,即便此时在中括号中可以识别到连续的普通字符,但其所代表的含义已与上述的连续的普通字符,即连续字符串的含义不同,具体地,连续字符串的各个字符之间是顺序连接的关系,而中括号中的连续的普通字符之间则是选择的关系。例如,若正则表达式为“abcd”,则该正则表达式匹配的结果也必须是“abcd”,而且不能缺少任意一个字符,也不能是其他的顺序连接;而若正则表达式为“[abcd]”,则该正则表达式匹配的结果应该是a、b、c和d中的任意一个字符。因此,当在正则表达式中识别到特殊字符“[”和“]”时,则这两个字符中间不需要识别连续的普通字符,或者说,这两个字符中间识别到的连续的普通字符不属于本说明书实施例需要合并的连续字符串。
在步骤S103中,采用解析模式遍历正则表达式的各个字符,构造初始非确定有穷自动机,即init-NFA,而且在构造init-NFA的过程中,当识别到正则表达式中的连续字符串标记后,可以将标记为连续字符串的每个字符对应的跳转关系合并为同一个跳转关系,即将连续字符串对应的有序连接的若干个状态跳转关系合并为同一个状态跳转关系。而由于连续字符串对应的有序连续的各个状态的跳转关系是确定的,而且连续字符串对应的有序连续的各个状态的跳转关系和其他状态之间也不存在跳转关系,因此,合并后的跳转关系并不会影响该连续字符串前后的其他状态之间的跳转关系,反而避免了连续字符串内部不必要的状态跳转关系,而且,其最终生成的init-NFA也可以作为识别器,用于各个字符串和正则表达式的匹配,因此,当正则表达式引擎的执行模式设置为NFA执行模式时,可以直接以此init-NFA为基础执行正则表达式的匹配,而且与常规的NFA相比,由于减少了许多不必要的状态和状态跳转,本说明书实施例的init-NFA具有更快的执行效率。
接下来,本说明书实施例通过图2和图3示出同一正则表达式下传统的NFA以及本说明书实施例的init-NFA各自的状态图。在图2和图3示出的例子中,正则表达式为“a*bcc”。
在一些实施例中,如在图2所示的实施例中,基于正则表达式构造传统的NFA的过程可以是,遍历正则表达式,并依次构造各个状态跳转关系。首先,识别到普通字符a,则构造从初始状态S0输入字符a后跳转到状态S1的状态跳转关系:S0×a→S1。接着,识别到特殊字符*,该特殊字符表示其前导字符,即a,会出现零次或任意多次,因此,需要对跳转关系S0×a→S1进行改造,变成S0×ε→S1、S1×a→S1以及S1x×ε→S2。其中,ε表示输入字符为空,即不需要输入任意字符即可实现状态间的跳转,值得注意的是,由于DFA中的状态跳转关系是确定的,因此DFA中不存在输入字符为ε,即无输入字符的状态跳转关系。因此,上述改造过程可以理解为取消了输入字符a的必要路径,构造了从初始状态S0到状态S2的空路径,即不需要输入任意字符就可以从初始状态跳转到状态S1,而且不需要输入任意字符就可以继续跳转到状态S2,以表示目标字符串中a出现次数为零次的可能性,其中,S2为当前的子表达式“a*”的最终状态;而且还构造了从状态S1输入字符a后可以跳转回状态S1的状态跳转关系,以表示目标字符串中a出现次数为任意多次的可能性。接着,识别到普通字符b,则构造从状态S2输入字符b后跳转到状态S3的状态跳转关系:S2×b→S3。接着,识别到普通字符b,则构造从状态S3输入字符c后跳转到状态S4的状态跳转关系:S3×c→S4。接着,识别到普通字符c,则构造从状态S4输入字符b后跳转到状态S5的状态跳转关系:S4×c→S5。而在字符c后没有识别到任何字符,表示正则表达式到此结束,因此,状态S5即为结束状态,状态图中S5对应的圆圈变成表示结束状态的同心双圆。
在一些实施例中,本说明书实施例中基于正则表达式构造init-NFA的过程可以是,先基于正则表达式构造完整的传统的NFA,再将标记为连续字符串的各个字符对应的各个跳转关系合并为同一个跳转关系,生成init-NFA。例如,在图3所示的实施例中,基于正则表达式构造init-NFA的过程可以是,先按照图2所示的实施例中相同的方式构造传统的NFA,并且识别到在步骤S101中标记出来的连续字符串“bcc”,而连续字符串“bcc”的各个字符“b”、第一个“c”和第二个“c”对应的状态跳转关系分别是S2×b→S3、S3×c→S4和S4×c→S5,因此,可以将上述三个状态跳转关系合并成为同一个状态跳转关系:S2×bcc→S3,而且合并后的子表达式的最终状态会继承合并前的子表达式的最终状态S5的其他跳转关系和状态属性,例如,在图2所示的实施例中,合并后子表示“bcc”的最终状态为状态S3,而合并前子表达式“bcc”的最终状态为状态S5,因此,状态S3会继承状态S5的其他跳转关系和状态属性,即状态S3变成为init-NFA中的结束状态。
在一些实施例中,本说明书实施例中基于正则表达式构造init-NFA的过程还可以是,直接遍历正则表达式,并依次构造各个状态跳转关系,当识别到的正则表达式中的字符没有携带连续字符串标记时,基于该字符构造的状态跳转关系的方式与传统的NFA中构造状态跳转关系的方式相同;而当识别到的正则表达式中的字符携带有连续字符串标记时,则继续识别后续各个字符,直到识别出的后续的下一个字符没有携带该连续字符串标记为止,即识别出整个连续字符串,再基于该连续字符串构造状态跳转关系,而基于连续字符串构造状态跳转关系的方式可以和基于普通字符构造的状态跳转关系的方式相同,其区别在于将状态跳转关系中的输入字符由一个普通字符变为连续字符串。例如,在图3所示的实施例中,对于正则表达式“a*bcc”,通过步骤S101,可以识别出其中包括一个连续字符串“bcc”,因此,正则表达式中的第一个字符a和第二个字符*不携带连续字符串标记,而后面三个字符b、第一个c和第二个c则携带有连续字符串标记。因此,先按照传统的方式构造第一个字符a和第二个字符*的状态跳转关系,其具体构造过程可以与图2所示的实施例中的传统的NFA中第一个字符a和第二个字符*的状态跳转关系的构造过程相同,在此不再赘述。接着,识别到下一个字符b携带有连续字符串标记,则需要继续识别字符b后续的其他字符,直到识别到的字符不携带连续字符串标记为止,或者是识别不到其他字符为止,即识别完整个正则表达式的最后一个字符,在图2的实施例中,识别出的连续字符串为“bcc”,因此,构造从状态S2输入连续字符串bcc后跳转到状态S3的状态跳转关系:S2×bcc→S3。而在连续字符串“bcc”后没有识别到任何字符,表示正则表达式到此结束,因此,状态S3即为结束状态,状态图中S3对应的圆圈变成表示结束状态的同心双圆。
对于正则表达式“a*bcc”,通过图2和图3可知,传统的NFA一共存在6个状态以及6个状态跳转关系,而本说明书实施例的init-NFA只有4个状态和4个状态跳转关系。显而易见的,当正则表达式中存在更多更长的连续字符串时,本说明书实施例的init-NFA与传统的NFA相比可以减少大量的状态数量和状态跳转关系数量,可以显著的提高执行效率。
值得注意的是,基于正则表达式构造传统的NFA的方式并不只是上述实施例中示出的构造方式,例如,对于正则表达式“a*bcc”,其构造生成的传统的NFA也不只是图2所示的实施例一种,因此,本说明书实施例基于正则表达式构造init-NFA的方式也不只是上述实施例中示出的构造方式,例如,对于正则表达式“a*bcc”,其构造生成的init-NFA也不只是图3所示的实施例一种,本说明书实施例构造init-NFA的方式还可以是其他的NFA构造方式,只要该方式中将标记为连续字符串的各个字符对应的状态跳转关系进行了合并,即可以视为是本说明书实施例的init-NFA的构造方式,本说明书实施例对此不做限制。
在一些正则表达式引擎中,NFA的状态跳转关系可以通过一张NFA状态跳转关系表进行存储。在一些实施例中,本说明书实施例的init-NFA也可以以NFA状态跳转关系表的形式存储状态跳转关系。
在一些实施例中,NFA的跳转关系的跳转字符可以分成两类,一类是单个跳转字符,例如a,即NFA的一个状态在输入指定字符a后即可以跳转为下一个状态;还有一类是跳转字符区间,即由中括号包含起来的多个字符,例如[a-h],即NFA的一个状态在输入跳转字符区间中的任意一个字符,即a到h之间的任意一个小写字母后,均可以跳转到下一个状态。
传统的NFA状态跳转关系表可以是一张二维矩阵列表,其中,行用于表示NFA的各个状态,列用于表示跳转关系中的跳转字符,而单元格则用于表示所在行的NFA的状态在输入所在列的跳转字符后跳转到的目的状态。特别地,由于NFA的状态输入同一个字符后可能跳转到多个不同的目的状态,因此,NFA状态跳转关系表中的单元格可以存储有多个目的状态。在传统的NFA状态跳转关系表中,对于单个跳转字符类型的跳转字符,只需要在该字符所在列下写入目的状态即可,而对于跳转字符区间类型的跳转字符,则需要在该跳转字符区间中包含的所有字符所在列下均写入目的状态。由于不管是单个跳转字符类型的跳转字符,还是跳转字符区间的跳转字符,均是在单个跳转字符所在列下写入对应的目的状态,因此,传统的NFA状态跳转关系表的存储结构可以视为单个跳转字符式的存储结构。
而在一些实施例中,为了囊括正则表达式所有可能的输入字符,正则表达式引擎生成的NFA状态跳转关系表中记录的跳转字符需要包括所有可能的输入字符,即需要存储256列。而实际上,NFA中的状态一般只会涉及少数的跳转字符或跳转字符区间,不会涉及所有的跳转字符,因此,传统的NFA状态跳转关系表的存储结构中存在很多浪费的存储空间。
在一些实施例中,NFA状态跳转关系表的存储结构可以是,对于NFA的各个状态,将其所有状态跳转关系分为单个跳转字符和跳转字符区间分别进行存储。对于单个跳转字符类型的跳转字符,将所有跳转字符分为有效跳转字符和无效跳转字符两种进行记录,例如,将传统的256列跳转字符分别合并为两列,其中,一列表示有效跳转字符,而另一列表示无效跳转字符;而对于跳转字符区间类型的跳转字符,则将所有跳转字符分为有效跳转字符和无效跳转字符两种进行记录,例如,将传统的256列跳转字符分别合并为三列,其中,一列表示有效跳转字符区间,而另外两列表示有效跳转字符区间左右两边的两个无效跳转字符区间,与传统的NFA状态跳转关系表中的存储结构不同的是,跳转字符区间中的各个跳转字符不需要拆分为单个跳转字符进行分别存储,同一个跳转字符区间内的跳转字符可以合并为一条存储记录。而单个跳转字符类型的存储记录和跳转字符区间类型的存储记录可以合并到同一个有序数组列表中进行存储。由于这种状态跳转关系存储结构中,单个跳转字符均合并为跳转字符区间的形式进行存储,因此,这种NFA状态跳转关系表的存储结构可以视为跳转字符区间式的存储结构。与传统的单个跳转字符式的存储结构相比,跳转字符区间式的存储结构减少了许多不必要记录的跳转字符列,因此,该存储结构能够有效地压缩状态跳转关系表的存储空间。
特别地,在一些实施例中,由于NFA中存在回溯机制,当输入的字符为无效跳转字符或无效跳转字符区间中的字符时,NFA还可以回溯前面的状态,查找其他可能的状态跳转关系,并不能直接宣布匹配过程的结束,因此,在上述的跳转字符区间式的存储结构中,也可以不记录无效跳转字符和无效跳转字符区间。
由于传统的单个跳转字符式的状态跳转存储结构,可以直接根据跳转字符匹配目的状态,而跳转字符区间式的状态跳转存储结构,需要先查找跳转字符所在的跳转字符区间,再匹配相对应的目的状态,因此,传统的单个跳转字符式的存储结构比跳转字符区间式的存储结构的匹配性能更好。
特别地,基于马尔科夫链原理可知,NFA中越靠近初始状态的状态跳转关系,其匹配的概率就越高。因此,在一些实施例中,在存储状态跳转关系时,对于比较靠近初始状态的状态跳转关系,即NFA前面几层的状态的状态跳转关系,可以以单个跳转字符式的存储结构进行存储;而对于距离初始状态较远的其他状态跳转关系,则可以以跳转字符区间式的存储结构进行存储。其中,NFA中状态的层级用于表示从初始状态跳转到该状态所需的最小跳转次数。
具体地,在一些实施例中,可以对NFA中前面三层的状态的状态跳转关系以单个跳转字符式的存储结构进行存储;而对不属于前面三层的状态跳转关系则以跳转字符区间式的存储结构进行存储。
在一些正则表达式引擎中,由于DFA比NFA具有更高的执行效率,因此会在NFA的基础上,通过对NFA确定化,生成一个与之相对应的DFA,再通过DFA去匹配字符串和正则表达式。
在一些实施例中,本说明书实施例的正则表达式引擎的执行模式可以分为NFA执行模式和DFA执行模式,当执行模式设置为NFA执行模式时,可以直接基于构造生成的init-NFA进行字符串和正则表达式的匹配;而当执行模式设置为DFA执行模式时,则可以在init-NFA的基础上,将init-NFA转换为DFA,再基于转换后的DFA进行字符串和正则表达式的匹配。
具体地,在一些实施例中,将init-NFA转换为DFA的方式可以是,先将init-NFA中的各个跳转字符的字符集转换为字节格式,以此限定状态数组的最大长度,此时,init-NFA中由连续字符串合并生成的状态和状态跳转关系会拆分为多个NFA状态和状态跳转关系,然后,可以基于子集构造法,将init-NFA转换为DFA,其中,子集构造法是本领域常见的NFA转换为DFA的方法,本说明书实施例在此不再赘述。
在NFA到DFA转换过程中,有很大一部分时间用于查询当前跳转字符对应的活跃NFA状态集是否已经存在。但是,DFA状态的跳转边往往是有限的,并且存在极大的重复概率,例如大部分情况下正则表达式的跳转字符只包括BASE64所包含的64个常用字符,即重复率近似为64/256=25%。因此,可以预处理DFA状态包含的活跃NFA状态集,而多个连续的跳转字符由于具有相同的跳转活跃NFA状态集,因此只需执行一次Radix树检索,极大减少了Radix树检索次数,进而缩小了NFA到DFA的执行时间。
在一些正则表达式引擎中,DFA的状态跳转关系可以通过一张DFA状态跳转关系表进行存储。在一些实施例中,本说明书实施例的转换后的DFA也可以以DFA状态跳转关系表的形式存储状态跳转关系。
在一些实施例中,DFA的跳转关系的跳转字符可以分成两类,一类是单个跳转字符,例如a,即DFA的一个状态在输入指定字符a后即可以跳转为下一个状态;还有一类是跳转字符区间,即由中括号包含起来的多个字符,例如[a-h],即DFA的一个状态在输入跳转字符区间中的任意一个字符,即a到h之间的任意一个小写字母后,均可以跳转到下一个状态。
传统的DFA状态跳转关系表可以是一张二维矩阵列表,其中,行用于表示DFA的各个状态,列用于表示跳转关系中的跳转字符,而单元格则用于表示所在行的DFA的状态在输入所在列的跳转字符后跳转到的目的状态。特别地,由于DFA的状态输入同一个字符后只会跳转到同一个目的状态,因此,DFA状态跳转关系表中的单元格只存储有一个目的状态。在传统的DFA状态跳转关系表中,对于单个跳转字符类型的跳转字符,只需要在该字符所在列下写入目的状态即可,而对于跳转字符区间类型的跳转字符,则需要在该跳转字符区间中包含的所有字符所在列下均写入目的状态。由于不管是单个跳转字符类型的跳转字符,还是跳转字符区间的跳转字符,均是在单个跳转字符所在列下写入对应的目的状态,因此,传统的DFA状态跳转关系表的存储结构可以视为单个跳转字符式的存储结构。
而在一些实施例中,为了囊括正则表达式所有可能的输入字符,正则表达式引擎生成的DFA状态跳转关系表中记录的跳转字符需要包括所有可能的输入字符,即需要存储256列。而实际上,DFA中的状态一般只会涉及少数的跳转字符或跳转字符区间,不会涉及所有的跳转字符,因此,传统的NFA状态跳转关系表的存储结构中存在很多浪费的存储空间。
在一些实施例中,DFA状态跳转关系表的存储结构可以是,对于DFA的各个状态,将其所有状态跳转关系分为单个跳转字符和跳转字符区间分别进行存储。对于单个跳转字符类型的跳转字符,将所有跳转字符分为有效跳转字符和无效跳转字符两种进行记录,例如,将传统的256列跳转字符分别合并为两列,其中,一列表示有效跳转字符,而另一列表示无效跳转字符;而对于跳转字符区间类型的跳转字符,则将所有跳转字符分为有效跳转字符和无效跳转字符两种进行记录,例如,将传统的256列跳转字符分别合并为三列,其中,一列表示有效跳转字符区间,而另外两列表示有效跳转字符区间左右两边的两个无效跳转字符区间,与传统的DFA状态跳转关系表中的存储结构不同的是,跳转字符区间中的各个跳转字符不需要拆分为单个跳转字符进行分别存储,同一个跳转字符区间内的跳转字符可以合并为一条存储记录。而单个跳转字符类型的存储记录和跳转字符区间类型的存储记录可以合并到同一个有序数组列表中进行存储。由于这种状态跳转关系存储结构中,单个跳转字符均合并为跳转字符区间的形式进行存储,因此,这种DFA状态跳转关系表的存储结构可以视为跳转字符区间式的存储结构。与传统的单个跳转字符式的存储结构相比,跳转字符区间式的存储结构减少了许多不必要记录的跳转字符列,因此,该存储结构能够有效地压缩状态跳转关系表的存储空间。
特别地,在一些实施例中,由于DFA中的状态跳转关系是确定的,当输入的字符为无效跳转字符或无效跳转字符区间中的字符时,DFA可以直接宣布匹配过程结束,因此,在上述的跳转字符区间式的存储结构中,需要记录无效跳转字符和无效跳转字符区间。
由于传统的单个跳转字符式的状态跳转存储结构,可以直接根据跳转字符匹配目的状态,而跳转字符区间式的状态跳转存储结构,需要先查找跳转字符所在的跳转字符区间,再匹配相对应的目的状态,因此,传统的单个跳转字符式的存储结构比跳转字符区间式的存储结构的匹配性能更好。
特别地,基于马尔科夫链原理可知,DFA中越靠近初始状态的状态跳转关系,其匹配的概率就越高。因此,在一些实施例中,在存储状态跳转关系时,对于比较靠近初始状态的状态跳转关系,即DFA前面几层的状态的状态跳转关系,可以以单个跳转字符式的存储结构进行存储;而对于距离初始状态较远的其他状态跳转关系,则可以以跳转字符区间式的存储结构进行存储。其中,DFA中状态的层级用于表示从初始状态跳转到该状态所需的最小跳转次数。
具体地,在一些实施例中,可以对DFA中前面三层的状态的状态跳转关系以单个跳转字符式的存储结构进行存储;而对不属于前面三层的状态跳转关系则以跳转字符区间式的存储结构进行存储。
接下来,本说明书实施例将通过一具体的实施例对本说明实施例的正则表达式引擎的构造方法做进一步的阐述。
如图4所示,图4是本说明书实施例根据一实施例示出的一种构造正则表达式引擎的流程示意图。
首先,在步骤S401中,当接收到对一个正则表达式以及基于该正则表达式构造正则表达式引擎的命令后,会先将该正则表达式转化为初始非确定有穷自动机,即init-NFA。具体地,在构建init-NFA前,会先遍历正则表达式,并将正则表达式中的连续的普通字符标记为连续字符串,再采用解析模式遍历正则表达式的字符构建init-NFA,其中,当遍历到的字符携带有连续字符串标记时,会将其后续的携带有同一个连续字符串标记的多个字符之间的状态跳转关系进行合并,使得一个连续字符串只对应一条状态跳转关系。
在步骤S402中,当构造完init-NFA后,则判断当前的执行模式是否为DFA模式,再确定是否需要将init-NFA转化为DFA。如果当前的执行模式为NFA模式,即不是DFA模式,则直接将init-NFA作为结果正则表达式引擎,并利用init-NFA进行正则表达式和字符串文本的匹配,即结束整个流程。如果当前的执行模式为DFA模式,则需要通过后续的步骤将init-NFA转化为对应的DFA,以利用该DFA进行正则表达式和字符串文本的匹配,即进入步骤S403。
在步骤S403中,在将init-NFA转化为对应的DFA之前,需要先将init-NFA中的各个跳转字符的字符集转换为字节格式,以此限定状态数组的最大长度,此时,init-NFA中由连续字符串合并生成的状态和状态跳转关系会拆分为多个NFA状态和状态跳转关系,拆分后的每个状态之间的状态跳转关系均只通过单个跳转字符进行跳转,以使得拆分后的每个状态之间的状态跳转关系均可以以状态跳转关系表的形式进行存储。
而在步骤S404中,在状态跳转关系表中存储记录init-NFA的各个状态的NFA状态跳转关系时,可以先判断当前需要存储的NFA状态跳转关系跳转前的init-NFA状态是否是该init-NFA中的前三层,即从初始状态跳转到该init-NFA状态所需的最小跳转次数不大于三次。在步骤S4041中,若当前init-NFA状态是该init-NFA的前三层的状态,则说明当前的NFA跳转关系在匹配正则表达式的过程中匹配到的概率比较高,因此,可以使用处理速度较快的方式,即采用单个跳转字符式的存储结构来存储当前的NFA状态跳转关系。而在步骤S4042中,若当前init-NFA状态不是该init-NFA的前三层的状态,则说明当前的NFA跳转关系在匹配正则表达式的过程中匹配到的概率比较低,因此,可以使用占用存储空间更小的方式,即采用跳转字符区间式的存储结构来存储当前的NFA状态跳转关系。
而在步骤S405中,在init-NFA中的每个状态的NFA状态跳转关系均存储完毕后,可以将所有单个跳转字符式的存储结构存储的NFA状态跳转关系和所有跳转字符区间式的存储结构存储的NFA状态跳转关系合并到同一个有序数组列表中,则该有序数组列表即为该init-NFA的状态跳转关系表。
在步骤S406中,在将init-NFA转换为对应的DFA时,可以先判断当前DFA状态是否是该DFA中的前三层,当前DFA状态所在层数可以根据该DFA状态对应的NFA状态在转换前的init-NFA中所在的层数确定。在步骤S4061中,若当前DFA状态是该DFA的前三层的状态,则预处理当前DFA状态包含的活跃NFA状态集,其中,当前DFA状态对应的NFA状态的单个跳转字符具有相同的跳转活跃NFA状态集;在步骤S4062中,若当前DFA状态不是该DFA的前三层的状态,则预处理当前DFA状态包含的活跃NFA状态集,其中,当前DFA状态对应的NFA状态的多个连续跳转字符具有相同的跳转活跃NFA状态集。
在步骤S407中,在均预处理完每个DFA状态包含的活跃NFA状态集之后,则需要判断是否当前DFA含有剩余的活跃NFA状态集。若当前DFA依然含有剩余的活跃NFA状态集,说明当前DFA还具有优化的空间,可以对当前的DFA进行进一步的优化,即进入步骤S408。在步骤S408中,在优化DFA时,可以先采用Radix树搜索是否已有含有与该剩余的活跃NFA状态集相同的活跃NFA状态集的DFA状态;若存在,则可以将该剩余活跃NFA状态集并入该DFA状态中,并判断是否还有其他剩余的NFA状态集,即回到步骤S407;而若不存在与该剩余的活跃NFA状态集相同的DFA状态,则在步骤S409中,可以创建新的DFA状态,并将该DFA状态信息添加到Radix树中,然后再在步骤S410中,修改原来的DFA状态跳转关系,使得原来的DFA状态关系从原来的跳转前的DFA状态跳转到跳转后的DFA状态,变成从跳转前的DFA状态跳转到新的DFA状态,再从新的DFA状态跳转到跳转后的DFA状态。而在添加完新的DFA状态后,可以继续判断是否还有剩余的活跃NFA状态集,即回到步骤S407。在步骤S407中,若当前DFA中已不存在剩余的活跃NFA状态集,则说明该DFA优化完毕,则可以将该DFA作为结果正则表达式引擎,以利用该DFA进行正则表达式和字符串文本的匹配,并结束整个流程。
与前文所述的正则表达式引擎的构造方法实施例相对应,本说明书实施例还提供一种正则表达式引擎的构造装置。
如图5所示,图5是本说明书实施例根据一实施例示出的一种正则表达式引擎的构造装置的结构示意图,包括以下模块:
字符识别模块510:用于遍历正则表达式的各个字符,将正则表达式中连续的普通字符标记为连续字符串;
引擎构造模块520:用于基于正则表达式构造初始非确定有穷自动机,将标记为连续字符串的字符对应的跳转关系合并为同一个跳转关系。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本说明书实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现前述任一实施例所述的方法。
图6示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图,该设备可以包括:处理器601、存储器602、输入/输出接口603、通信接口604和总线605。其中处理器601、存储器602、输入/输出接口603和通信接口604通过总线605实现彼此之间在设备内部的通信连接。
处理器601可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。处理器601还可以包括显卡,所述显卡可以是Nvidia titan X显卡或者1080Ti显卡等。
存储器602可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器602可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器602中,并由处理器601来调用执行。
输入/输出接口603用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口604用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线605包括一通路,在设备的各个组件(例如处理器601、存储器602、输入/输出接口603和通信接口604)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器601、存储器602、输入/输出接口603、通信接口604以及总线605,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述任一实施例所述的方法。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。

Claims (13)

1.一种正则表达式引擎的构造方法,所述方法包括:
遍历正则表达式的各个字符,将所述正则表达式中连续的普通字符标记为连续字符串;
基于所述正则表达式构造初始非确定有穷自动机,其中,将标记为所述连续字符串的字符对应的NFA状态跳转关系合并为同一个NFA状态跳转关系。
2.根据权利要求1所述的方法,所述方法还包括:
以NFA状态跳转关系表记录所述初始非确定有穷自动机的NFA状态跳转关系。
3.根据权利要求2所述的方法,所述以NFA状态跳转关系表记录所述初始非确定有穷自动机的NFA状态跳转关系的步骤包括:
当所述NFA状态跳转关系的跳转字符为单个跳转字符时,在所述NFA状态跳转关系表中记录所述NFA状态跳转关系的有效跳转字符和无效跳转字符;
当所述NFA状态跳转关系的跳转字符为跳转字符区间时,在所述NFA状态跳转关系表中记录所述NFA状态跳转关系的有效跳转字符区间和无效跳转字符区间。
4.根据权利要求2所述的方法,所述方法还包括:
当所述初始非确定有穷自动机的初始状态跳转到所述NFA状态跳转关系中跳转前的状态所需要的最小跳转次数不大于预设的次数阈值时,在所述NFA状态跳转关系表中以单个跳转字符数组的形式记录所述状态跳转关系。
5.根据权利要求4所述的方法,所述预设的次数阈值为3。
6.根据权利要求1所述的方法,所述方法还包括:
当执行模式被设置为DFA执行模式时,将所述初始非确定有穷自动机转换为确定有穷自动机。
7.根据权利要求6所述的方法,所述方法还包括:
以DFA状态跳转关系表记录所述确定有穷自动机的DFA状态跳转关系。
8.根据权利要求7所述的方法,所述以DFA状态跳转关系表记录所述确定有穷自动机的DFA状态跳转关系的步骤包括:
当所述DFA状态跳转关系的跳转字符为单个跳转字符时,在所述DFA状态跳转关系表中记录所述DFA状态跳转关系的有效跳转字符和无效跳转字符;
当所述DFA状态跳转关系的跳转字符为跳转字符区间时,在所述DFA状态跳转关系表中记录所述DFA状态跳转关系的有效跳转字符区间和无效跳转字符区间。
9.根据权利要求7所述的方法,所述方法还包括:
当所述确定有穷自动机的初始状态跳转到所述DFA状态跳转关系中跳转前的状态所需要的最小跳转次数不大于预设的次数阈值时,在所述DFA状态跳转关系表中以单个跳转字符数组的形式记录所述DFA状态跳转关系。
10.根据权利要求9所述的方法,所述预设的次数阈值为3。
11.一种正则表达式引擎的构造装置,所述装置包括:
字符识别模块,用于遍历正则表达式的各个字符,将所述正则表达式中连续的普通字符标记为连续字符串;
引擎构造模块,用于基于所述正则表达式构造初始非确定有穷自动机,其中,将标记为所述连续字符串的字符对应的NFA状态跳转关系合并为同一个NFA状态跳转关系。
12.一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现权利要求1-10任意一项所述的方法。
13.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现权利要求1-10任意一项所述的方法。
CN202210476217.4A 2022-04-29 2022-04-29 一种正则表达式引擎的构造方法、装置、存储介质及设备 Pending CN114896469A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210476217.4A CN114896469A (zh) 2022-04-29 2022-04-29 一种正则表达式引擎的构造方法、装置、存储介质及设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210476217.4A CN114896469A (zh) 2022-04-29 2022-04-29 一种正则表达式引擎的构造方法、装置、存储介质及设备

Publications (1)

Publication Number Publication Date
CN114896469A true CN114896469A (zh) 2022-08-12

Family

ID=82719324

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210476217.4A Pending CN114896469A (zh) 2022-04-29 2022-04-29 一种正则表达式引擎的构造方法、装置、存储介质及设备

Country Status (1)

Country Link
CN (1) CN114896469A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118113728A (zh) * 2024-04-30 2024-05-31 浪潮电子信息产业股份有限公司 一种数据查询方法、系统、装置、设备、可读存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101174261A (zh) * 2006-11-03 2008-05-07 北京航空航天大学 用于多正则表达式联合搜索的扩展有限状态机及搜索方法
WO2012133976A1 (ko) * 2011-03-28 2012-10-04 Kim Kyung Mi 복수의 정규 표현식을 동시에 사용하여 검색하기 위해 복수의 비결정적 유한 오토마타를 병합하는 방법, 서버, 단말 장치 및 컴퓨터 판독 가능한 기록 매체
CN111159496A (zh) * 2019-12-31 2020-05-15 奇安信科技集团股份有限公司 正则表达式nfa的构造方法及装置
CN111259122A (zh) * 2020-01-13 2020-06-09 奇安信科技集团股份有限公司 网络包检测方法及装置
CN111262589A (zh) * 2020-01-13 2020-06-09 奇安信科技集团股份有限公司 一种dfa空间压缩方法及装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101174261A (zh) * 2006-11-03 2008-05-07 北京航空航天大学 用于多正则表达式联合搜索的扩展有限状态机及搜索方法
WO2012133976A1 (ko) * 2011-03-28 2012-10-04 Kim Kyung Mi 복수의 정규 표현식을 동시에 사용하여 검색하기 위해 복수의 비결정적 유한 오토마타를 병합하는 방법, 서버, 단말 장치 및 컴퓨터 판독 가능한 기록 매체
CN111159496A (zh) * 2019-12-31 2020-05-15 奇安信科技集团股份有限公司 正则表达式nfa的构造方法及装置
CN111259122A (zh) * 2020-01-13 2020-06-09 奇安信科技集团股份有限公司 网络包检测方法及装置
CN111262589A (zh) * 2020-01-13 2020-06-09 奇安信科技集团股份有限公司 一种dfa空间压缩方法及装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118113728A (zh) * 2024-04-30 2024-05-31 浪潮电子信息产业股份有限公司 一种数据查询方法、系统、装置、设备、可读存储介质

Similar Documents

Publication Publication Date Title
CN110502227B (zh) 代码补全的方法及装置、存储介质、电子设备
CN110688307B (zh) JavaScript代码检测方法、装置、设备和存储介质
CN110502520B (zh) 一种数据入库的方法、系统、设备及计算机可读存储介质
CN112100361B (zh) 一种基于ac自动机的字符串多模模糊匹配方法
CN111159329A (zh) 敏感词检测方法、装置、终端设备和计算机可读存储介质
CN109144964A (zh) 基于机器学习的日志解析方法和装置
US11836331B2 (en) Mathematical models of graphical user interfaces
CN112347142B (zh) 数据处理方法及装置
CN111460011A (zh) 页面数据展示方法、装置、服务器及存储介质
CN113760839A (zh) 日志数据压缩处理方法、装置、电子设备和存储介质
US20160364474A1 (en) Identifying Data Offsets Using Binary Masks
CN114896469A (zh) 一种正则表达式引擎的构造方法、装置、存储介质及设备
CN116467047A (zh) 针对容器配置合规性的检测方法、装置、存储介质及终端
CN113760246B (zh) 应用程序文本语言处理方法、装置、电子设备及存储介质
CN115796146A (zh) 一种文件对比方法及装置
CN114462381A (zh) 数据处理方法、装置、设备及存储介质
CN112214494B (zh) 检索方法及装置
CN114330303A (zh) 文本纠错方法及相关设备
CN114296978A (zh) 一种软件工具包地址定位方法及装置
CN113468866A (zh) 非标准json串的解析方法及装置
JP2012173745A (ja) データベース解析装置及びデータベース解析プログラム
CN109992293B (zh) Android系统组件版本信息的组装方法及装置
CN111164560A (zh) 用于动态地定义数据记录格式的技术
CN112579839A (zh) 大规模特征的多模匹配方法、装置及存储介质
Timmerman Performance Testing Owl, Parser Generator for Visibly Pushdown Grammars

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