一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种正则表达式转换方法、装置、设备及存储介质与流程

2021-11-05 22:39:00 来源:中国专利 TAG:


1.本技术属于自然语言处理技术领域,具体涉及一种正则表达式转换方法、装置、设备及存储介质。


背景技术:

2.在自然语言处理技术领域,正则表达式是用来描述、匹配某个句法规则的字符串,常被用于文本检索、文本匹配或文本替换。正则表达式由常量字符和元字符组成,常量字符用于在文本检索、文本匹配或文本替换中匹配文本,元字符用于定义通过常量字符匹配文本时的运算规则。
3.相关技术中,通常由用户依据需要匹配的文本信息手工书写多个正则表达式形成正则集合,将该正则集合提供给设备,设备依据该正则集合对所需匹配内容进行标准化匹配。
4.但用户手工书写正则表达式,效率很低,且易出错,依据人工书写的正则表达式进行文本匹配,需要花费很长时间,且准确性不高。


技术实现要素:

5.本技术提出一种正则表达式转换方法、装置、设备及存储介质,自动将原始逻辑表达式转换为对应的正则表达式。实现自动生成满足用户逻辑需求的正则表达式,生成速度快,准确性高,能快速生成大量正则表达式,满足线上文本匹配的时效性需求。
6.本技术第一方面实施例提出了一种正则表达式转换方法,包括:
7.获取原始逻辑表达式;
8.生成所述原始逻辑表达式对应的层级列表,所述层级列表中包括按照逻辑层级的预设顺序排列的多个子表达式;
9.根据所述层级列表和预设元字符映射表,将所述原始逻辑表达式转换为对应的正则表达式。
10.在本技术的一些实施例中,所述生成所述原始逻辑表达式对应的层级列表,包括:
11.从原始逻辑表达式中获取常量数组和所述常量数组对应的逻辑表达式;
12.根据所述常量数组和所述逻辑表达式,生成所述原始逻辑表达式对应的层级列表。
13.在本技术的一些实施例中,所述根据所述常量数组和所述逻辑表达式,生成所述原始逻辑表达式对应的层级列表,包括:
14.将所述逻辑表达式中的常量标识符替换为所述常量数组中对应的常量字符,得到常量逻辑表达式;
15.根据所述常量逻辑表达式包括的各逻辑符号和括号,将所述常量逻辑表达式拆分为多个子表达式;
16.根据所述各逻辑符号的运算优先级和所述多个子表达式,生成所述原始逻辑表达
式对应的层级列表。
17.在本技术的一些实施例中,所述根据所述各逻辑符号的运算优先级和所述多个子表达式,生成所述原始逻辑表达式对应的层级列表,包括:
18.分别确定每个子表达式中需执行的逻辑符号;
19.根据所述每个子表达式中需执行的逻辑符号的运算优先级及所述每个子表达式中的括号在所述常量逻辑表达式中所处的括号层级,分别确定所述每个子表达式对应的逻辑层级;
20.按照逻辑层级的预设顺序,对所述每个子表达式排序,得到所述原始逻辑表达式对应的层级列表。
21.在本技术的一些实施例中,所述根据所述层级列表和预设元字符映射表,将所述原始逻辑表达式转换为对应的正则表达式,包括:
22.根据预设元字符映射表,分别将所述层级列表包括的各子表达式转换为子正则表达式;
23.将得到的每个所述子正则表达式拼接为所述原始逻辑表达式对应的正则表达式。
24.在本技术的一些实施例中,所述根据预设元字符映射表,分别将所述层级列表包括的各子表达式转换为子正则表达式,包括:
25.从所述层级列表中当前层级最高的至少一个子表达式中随机获取一个子表达式;
26.根据预设元字符映射表,将获取的所述子表达式转换为对应的子正则表达式;
27.从所述层级列表中删除获取的所述子表达式,返回执行所述从所述层级列表中当前层级最高的至少一个子表达式中随机获取一个子表达式的操作,循环执行直至所述层级列表中不再包含子表达式为止。
28.在本技术的一些实施例中,所述根据预设元字符映射表,将获取的所述子表达式转换为对应的子正则表达式,包括:
29.判断获取的所述子表达式中是否包含预设元字符映射表中配置的预设符号;
30.如果是,则从所述预设元字符映射表中获取所述预设符号对应的元字符及替换规则;
31.根据所述预设符号对应的所述替换规则,将所述子表达式中的所述预设符号替换为所述预设符号对应的元字符,得到所述子表达式对应的子正则表达式。
32.在本技术的一些实施例中,所述将所述原始逻辑表达式转换为对应的正则表达式之后,还包括:
33.对所述原始逻辑表达式对应的正则表达式进行编译;
34.根据编译后的正则表达式进行文本匹配。
35.本技术第二方面的实施例提供了一种正则表达式转换装置,包括:
36.获取模块,用于获取原始逻辑表达式;
37.生成模块,用于根据所述原始逻辑表达式包括的各逻辑符号的运算优先级,生成所述原始逻辑表达式对应的层级列表;
38.转换模块,用于根据所述层级列表和预设元字符映射表,将所述原始逻辑表达式转换为对应的正则表达式。
39.本技术第三方面的实施例提供了一种电子设备,包括存储器、处理器及存储在所
述存储器上并可在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序以实现上述第一方面所述的方法。
40.本技术第四方面的实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行实现上述第一方面所述的方法。
41.本技术实施例中提供的技术方案,至少具有如下技术效果或优点:
42.在本技术实施例中,用户可以个性化地编辑原始逻辑表达式,设备自动将用户输入的原始逻辑表达式转换为对应的正则表达式。实现自动生成满足用户逻辑需求的正则表达式,生成速度快,准确性高,能够生成逻辑层级多层嵌套的复杂的正则表达式,如生成“有且不能有
……”
,“不能有但当且仅当在有
……
时可以有”等复杂逻辑表达对应的正则表达式。而且能快速生成大量正则表达式,能够满足线上文本匹配的时效性需求,可以实现字级、词级、句式级等级别随意组合的文本匹配,无需分布匹配,提高了文本匹配效率。
43.本技术附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变的明显,或通过本技术的实践了解到。
附图说明
44.通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本技术的限制。而且在整个附图中,用相同的参考符号表示相同的部件。
45.在附图中:
46.图1示出了本技术一实施例所提供的一种正则表达式转换方法的流程图;
47.图2示出了本技术一实施例所提供的一种正则表达式转换方法的另一流程图;
48.图3示出了本技术一实施例所提供的一种正则表达式转换装置的结构示意图;
49.图4示出了本技术一实施例所提供的一种电子设备的结构示意图;
50.图5示出了本技术一实施例所提供的一种存储介质的示意图。
具体实施方式
51.下面将参照附图更详细地描述本技术的示例性实施方式。虽然附图中显示了本技术的示例性实施方式,然而应当理解,可以以各种形式实现本技术而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了能够更透彻地理解本技术,并且能够将本技术的范围完整的传达给本领域的技术人员。
52.需要注意的是,除非另有说明,本技术使用的技术术语或者科学术语应当为本技术所属领域技术人员所理解的通常意义。
53.下面结合附图来描述根据本技术实施例提出的一种正则表达式转换方法、装置、设备及存储介质。
54.目前相关技术中,在自然语言处理技术领域,经常利用正则表达式来进行文本检索、文本匹配或文本替换等操作。具体通常由用户依据需要匹配的文本信息手工书写得到多个正则表达式形成正则集合,将该正则集合提供给设备,设备依据该正则集合对所需匹配内容进行标准化匹配。但人工书写正则表达式,效率很低,易出错,依据人工书写的正则表达式进行文本匹配,需要花费很长时间,且准确性不高。
55.基于此,本技术实施例提出了一种正则表达式转换方法,在该方法中用户只需提供原始逻辑表达式,自动根据该原始逻辑表达式生成对应的层级列表,该层级列表中包括多个按层级排列的子表达式。依据预设元字符映射表中包括的预设逻辑符号、元字符及替换规则的映射关系,按照层级列表中层级由高到低的顺序依次将子表达式中的预设逻辑符号替换为元字符,从而得到原始逻辑表达式对应的正则表达式。实现自动生成满足用户逻辑需求的正则表达式,生成速度快,准确性高,能够生成逻辑层级多层嵌套的复杂的正则表达式,且能快速生成大量正则表达式,能够满足线上文本匹配的时效性需求,可以实现字级、词级、句式级等级别随意组合的文本匹配,无需分布匹配,提高了文本匹配效率。
56.参见图1,该方法具体包括以下步骤:
57.步骤101:获取原始逻辑表达式。
58.本技术实施例提供一个供用户输入原始逻辑表达式的正则转换接口,用户在该正则转换接口中编辑自定义的原始逻辑表达式,原始逻辑表达式可以包括常量数组和该常量数组对应的逻辑表达式,其中常量数组中包括多个常量字符,这多个常量字符中包括在匹配文本时需要必须命中的常量字符和必须不能命中的常量字符。常量字符可以为文字、符号、数字或三者中至少两种组合而成的字符串,其中文字可以为中文、英语、德语等任意语言中的字、词或句子等。符号可以为标点符号、数学符号、字符符号等任意符号。例如,常量数组['疼','痛','不#疼#5','不#痛#5']中,'疼'、'痛'、'不#疼#5'和'不#痛#5'即为四个常量字符。其中,“#”为连接符,'不#疼#5'表示所有“不
……
疼”的句式且“不”字与“疼”字之间间隔不能超过5个字符。
[0059]
常量字符对应的逻辑表达式用于表达常量数组包括的多个常量字符之间的逻辑关系,逻辑表达式中包括逻辑符号、括号和常量字符对应的常量标识符,常量标识符用于标识常量数组中的常量字符,逻辑符号用于表示常量字符之间的逻辑关系。例如,常量数组['疼','痛','不#疼#5','不#痛#5']对应的逻辑表达式可以为(1|2)&!(3|4),其中1、2、3、4为常量标识符,分别标识常量字符'疼'、'痛'、'不#疼#5'和'不#痛#5'。“|”、“&”和“!”依次为逻辑符号或、与、非。此示例中常量标识符是以常量字符在常量数组中的排列序号进行标识的,实际应用中还可以在常量数组中为每个常量字符标注下标,在逻辑表达式中利用常量字符的下标作为常量标识符。
[0060]
除上述常量数据和对应的逻辑表达式外,用户输入的原始逻辑表达式还可以包括文本标签,文本标签用于表达用户需要匹配的文本含义。例如,该文本标签可以为“痛感明显”。相应地,用户输入的完整的原始逻辑表达式可以为:'痛感明显':{'words':['疼','痛','不#疼#5','不#痛#5'],'logic':'(1|2)&!(3|4)'}。或者,可以为:{'words':['疼','痛','不#疼#5','不#痛#5'],'logic':'(1|2)&!(3|4)'}。或者,可以为:{['疼','痛','不#疼#5','不#痛#5'],'(1|2)&!(3|4)'}。或者,可以为:{[疼,痛,不#疼#5,不#痛#5],(1|2)&!(3|4)}。或者,可以为:[疼,痛,不#疼#5,不#痛#5],(1|2)&!(3|4),等等。其中,上述各原始逻辑表达式的示例中,'疼'、'痛'、'不#疼#5'和'不#痛#5'四个常量字符中,'疼'和'痛'为文本匹配中必须命中的常量字符,'不#疼#5'和'不#痛#5'为必须不能命中的常量字符。
[0061]
以上示出的原始逻辑表达式的结构仅作为一种示例,本技术实施例对原始逻辑表达式的数据组成结构不作特殊限定,实际应用中可根据需求设计原始逻辑表达式的结构。为了使用户能够准确地输入满足预先设计的数据组成结构的原始逻辑表达式,避免因格式
问题反复修改原始逻辑表达式的情况发生,本技术实施例可以在显示正则转换接口的同时显示用于提示原始逻辑表达式的结构格式的提示信息,在该提示信息中可以给出原始逻辑表达式的示例,以便用户参考该提示信息输入正确格式的原始逻辑表达式。
[0062]
当检测到用户在正则转换接口进行编辑时,从该正则转换接口获取用户输入的原始逻辑表达式。通过该正则转换接口用户可以编辑自定义的原始逻辑表达式,满足用户个性化逻辑匹配需求,且原始逻辑表达式的内容简单,用户输入原始逻辑表达式时无需考虑正则表达式复杂的语法要求和众多的元字符,输入原始逻辑表达式不易出错,编辑效率高。
[0063]
步骤102:生成原始逻辑表达式对应的层级列表,该层级列表中包括按照逻辑层级的预设顺序排列的多个子表达式。
[0064]
原始逻辑表达式对应的层级列表中包括多个子表达式,这多个子表达式是从原始逻辑表达式中拆分出来的,且在层级列表中这多个子表达式是按照逻辑层级的预设顺序排列的,预设顺序可以为逻辑层级从高到低的顺序或者逻辑层级从低到高的顺序。子表达式的逻辑层级越高,则表明在运算该原始逻辑表达式时该子表达式的执行优先级越高。
[0065]
本步骤具体通过如下步骤s1和s2的操作来生成原始逻辑表达式对应的层级列表,具体包括:
[0066]
s1:从原始逻辑表达式中获取常量数组和常量数组对应的逻辑表达式。
[0067]
从正则转换接口获取到用户输入的原始逻辑表达式后,根据预设的原始逻辑表达式的数据组成结构,解析该原始逻辑表达式,从该原始逻辑表达式中识别出其包括的常量数组和该常量数组对应的逻辑表达式。
[0068]
例如,假设从正则转换接口获得的原始逻辑表达式为'痛感明显':{'words':['疼','痛','不#疼#5','不#痛#5'],'logic':'(1|2)&!(3|4)'},则从该原始逻辑表达式中提取出常量数组['疼','痛','不#疼#5','不#痛#5']和对应的逻辑表达式'(1|2)&!(3|4)'。
[0069]
s2:根据常量数组和逻辑表达式,生成原始逻辑表达式对应的层级列表。
[0070]
通过步骤s1获得原始逻辑表达式包括的常量数组和对应的逻辑表达式后,通过如下步骤s21

s23的操作来生成原始逻辑表达式对应的层级列表,具体包括:
[0071]
s21:将逻辑表达式中的常量标识符替换为常量数组中对应的常量字符,得到常量逻辑表达式。
[0072]
从常量数组对应的逻辑表达式的第一个字符开始,判断当前字符是否为常量标识符,如果是,则从常量数组中获取该常量标识符对应的常量字符,将该逻辑表达式中的该常量标识符替换为其对应的常量字符。若判断出当前字符不是常量标识符,则跳过当前字符,判断下一个字符是否为常量标识符。如此依次对逻辑表达式中各个字符进行遍历,将逻辑表达式中包括的每个常量标识符均替换为对应的常量字符,即得到了常量逻辑表达式。
[0073]
例如,从原始逻辑表达式获取到常量数组['疼','痛','不#疼#5','不#痛#5']和对应的逻辑表达式'(1|2)&!(3|4)'。依次将逻辑表达式中的常量标识符1、2、3和4替换为常量数组中的常量字符'疼'、'痛'、'不#疼#5'和'不#痛#5',得到常量逻辑表达式[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]。
[0074]
在本技术的另一些实施例中还预先设置了各逻辑符号的运算优先级,如运算优先级由高到底的顺序为非“!”、与“&”、或“|”等。根据常量数组对应的逻辑表达式中各逻辑符
号的运算优先级,来依次替换各逻辑符号对应的常量标识符。如先先替换非“!”对应的常量标识符,再替换与“&”对应的常量标识符,最后替换或“|”对应的常量标识符。
[0075]
例如,逻辑表达式'(1|2)&!(3|4)'中运算优先级最高的逻辑符号非“!”所需运算的为(3|4),是一个逻辑算式,并不是一个常量标识符,因此不进行替换操作。运算优先级次高的逻辑符号“&”所需运算的为(1|2)&!(3|4),也是一个逻辑算式,并不是特定的常量标识符,因此不进行替换操作。最后运算优先级最低的逻辑符号“|”所需运算的为(1|2)和(3|4),其中1、2、3、4为特定的常量标识符,因此从常量数组['疼','痛','不#疼#5','不#痛#5']中分别获取这些常量标识符对应的常量字符,将在逻辑表达式'(1|2)&!(3|4)中分别将这些常量标识符替换为对应的常量字符,得到最终的常量逻辑表达式[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]。
[0076]
在本技术的另一些实施例中,还可以按照逻辑表达式中括号所表达的层级来替换常量标识符。例如,逻辑表达式'(1|2)&!(3|4)'中最高层级即为两个括号限定的层级,即优先替换(1|2)和(3|4)中的常量标识符。
[0077]
通过上述任一方式将逻辑表达式中的每个常量标识符替换为对应的常量字符后,通过如下步骤s22和s23的操作生成原始逻辑表达式对应的层级列表。
[0078]
s22:根据常量逻辑表达式包括的各逻辑符号和括号,将常量逻辑表达式拆分为多个子表达式。
[0079]
根据常量逻辑表达式包括的各逻辑符号和括号,确定每个逻辑符号运算所需的部分表达式,将每个逻辑符号对应的部分表达式拆分出来,形成多个子表达式,每个子表达式在运算时仅执行一个逻辑符号的运算。
[0080]
例如,常量逻辑表达式[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]中包括四个逻辑符号从前往后依次为'|'、'&'、'!'、'|',第一个逻辑符号'|'对应的子表达式为['疼','|','痛'],最后一个逻辑符号'|'对应的子表达式为['不#疼#5','|','不#痛#5'],非'!'对应的子表达式为['!',['不#疼#5','|','不#痛#5']],与'&'对应的子表达式为[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]。
[0081]
s23:根据各逻辑符号的运算优先级和多个子表达式,生成原始逻辑表达式对应的层级列表。
[0082]
具体地,分别确定每个子表达式中需执行的逻辑符号;根据每个子表达式中需执行的逻辑符号的运算优先级及每个子表达式中的括号在常量逻辑表达式中所处的括号层级,分别确定每个子表达式对应的逻辑层级;按照逻辑层级的预设顺序,对每个子表达式排序,得到原始逻辑表达式对应的层级列表。预设顺序可以为按照逻辑层级由高到低的顺序,或者按照逻辑层级由低到高的顺序。
[0083]
例如,常量逻辑表达式[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]共拆分出4个子表达式分别为['疼','|','痛']、['不#疼#5','|','不#痛#5']、['!',['不#疼#5','|','不#痛#5']]和[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]。其中,子表达式['疼','|','痛']中所需执行的逻辑符号为'|',其包括的括号在原常量逻辑表达式中的括号层级为2。子表达式['不#疼#5','|','不#痛#5']中所需执行的逻辑符号为'|',其包括的括号在原常量逻辑表达式中的括号层级为3。子表达式['!',['不#疼#5','|','不#痛#5']]中所需执行的逻辑符号为'!',其包括的括号在原常量逻辑表达式
中的括号层级为2,此处需注意的是每个子表达式中只关注最外层的括号,因为内层的括号在其他子表达式中已经处理过了。子表达式[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]中所需执行的逻辑符号为'&',其包括的最外层括号在原常量逻辑表达式中的括号层级为1。在该示例中括号层级的越高,执行优先级越高。
[0084]
根据逻辑符号的运算优先级及括号层级来确定子表达式的逻辑层级,其中,括号层级越高,则子表达式的逻辑层级越高。逻辑符号的运算优先级越高,子表达式的逻辑层级也越高。首先按照各子表达式对应的最外层括号的括号层级由高到低的顺序,对各子表达式排序。对于括号层级相同的子表达式,再按照对应的逻辑符号的运算优先级的顺序进行排序。最终得到的子表达式的排列顺序即是按照逻辑层级由高到低的顺序排列的。当然,也可以按照逻辑层级由低到高的顺序进行排列。
[0085]
例如,子表达式['疼','|','痛']对应的逻辑符号为'|'以及对应的括号层级为2。子表达式['不#疼#5','|','不#痛#5']对应的逻辑符号为'|'以及对应的括号层级为3。子表达式['!',['不#疼#5','|','不#痛#5']]对应的逻辑符号为'!'以及对应的括号层级为2。子表达式[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]对应的逻辑符号为'&'以及对应的括号层级为1。首先按照括号层级由高到低的顺序排列为表1所示的子表达式序列。其中子表达式['疼','|','痛']和['!',['不#疼#5','|','不#痛#5']]排在同一层级,再依据二者对应的逻辑符号的运算优先级进行排序。['!',['不#疼#5','|','不#痛#5']]对应的逻辑符号'!'的运算优先级高于['疼','|','痛']对应的逻辑符号'|'的运算优先级,因此最后排序后得到的层级列表如表2所示。
[0086]
表1
[0087]
['不#疼#5','|','不#痛#5']['疼','|','痛']、['!',['不#疼#5','|','不#痛#5']][['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]
[0088]
表2
[0089]
['不#疼#5','|','不#痛#5']['!',['不#疼#5','|','不#痛#5']]['疼','|','痛'][['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]]
[0090]
步骤103:根据层级列表和预设元字符映射表,将原始逻辑表达式转换为对应的正则表达式。
[0091]
原始逻辑表达式中的一些符号是为了人为输入时的简便与通俗易懂,可以在人工编辑原始逻辑表达式时不易出错且提高效率。但是对于计算机编程语言是无法编译这些符号的,因此需将其转化为正则表达式中的标准表达形式。基于此本技术实施例预先配置了预设元字符映射表,预设元字符映射表中包括预设符号、元字符及替换规则的映射关系。预设符号可以为“#”、“@”、“^”等任意符号以及包括这些符号的字符串等。预设符号对应的元字符为正则表达中的标准的元字符或多个元字符按照对应的替换规则组成的元字符组合。
[0092]
本步骤根据预设元字符映射表,分别将层级列表包括的各子表达式转换为子正则表达式。具体地,从层级列表中当前层级最高的至少一个子表达式中随机获取一个子表达式;根据预设元字符映射表,将获取的子表达式转换为对应的子正则表达式;从层级列表中
删除获取的子表达式,返回执行从层级列表中当前层级最高的至少一个子表达式中随机获取一个子表达式的操作,循环执行直至层级列表中不再包含子表达式为止。通过循环递归的替换,能够提高转换效率,且不易遗漏,准确性高。
[0093]
将获取的子表达式转换为对应的子正则表达式的具体过程为,判断获取的子表达式中是否包含预设元字符映射表中配置的预设符号。如果是,则从预设元字符映射表中获取预设符号对应的元字符及替换规则。根据预设符号对应的替换规则,将子表达式中的预设符号替换为预设符号对应的元字符,得到子表达式对应的子正则表达式。
[0094]
预设元字符映射表中配置的预设符号可以为包括连接符“#”的字符串,如“a#b#δ”或“a#c#b#δ”等,其中,a、b、c为用于进行文本匹配的字或词等,δ为数字。“a#b#δ”表示a
……
b的句式,a与b之间间隔的字符数目不能超过δ。“a#c#b#δ”表示a
……
b
……
c的句式,a与b之间以及b与c之间间隔的字符数目不能超过δ。包括连接符的字符串中第一个字符a与最后一个字符b之间可以有任意通过连接符“#”连接的中间字符。
[0095]
预设元字符映射表中配置了包括连接符“#”的字符串对应的元字符及替换规则,如“a#b#δ”对应的按照替换规则构成的元字符组合为“a(?=.{0,δ}?b)”,“a#c#b#δ”对应的按照替换规则构成的元字符组合为“a(?=.{0,δ}?b)(.*?c.*?)b”。
[0096]
由上可知,控制字符数量的数字的位置存在于整个表达的首位词与末位词之间,且数字的前面添加元字符“?=.”,后面添加元字符“?”,因此可以先将“a#bδ”中的“#δ”替换为“_(?=.{0,δ}?_)”的形式,然后通过算法将该表达式的首尾词截取出来,按顺序填补到以上空缺中。至此,完成对字符数量限制的替换工作。
[0097]
对于位于首尾词之间字符,如“a#b#c#δ”中的“#b#c#”,可以通过算法截取出除首尾词外的中间以连接符“#”连接的词,并将其前后的连接符“#”替换为元字符“.*?”,全部替换完成后,首尾添加“()”,完成层级包裹,即完成替换操作。
[0098]
例如,假设常量字符为“a#b#c#20”,则根据预设元字符映射表将该常量字符转换为a(?=.{0,20}?c)(.*?b.*?)c。再如常量字符“a#b#c#d#20”,则根据预设元字符映射表将该常量字符转换为“a(?=.{0,20}?d)(.*?b.*?c.*?)d”。
[0099]
以上述表2所示的层级列表为例来说明转换生成正则表达式的过程。首先从该层级列表中获取层级最高的一个子表达式['不#疼#5','|','不#痛#5'],确定该子表达式中包含预设元字符映射表中配置的预设符号“#”,根据预设元字符映射表将对该子表达式中包含预设符号“#”的常量字符进行替换,得到对应的子正则表达式(不(?=.{0,5}?疼)(.*?)疼)|(不(?=.{0,5}?痛)(.*?)痛)。然后对层级次高的['!',['不#疼#5','|','不#痛#5']]进行转换,需要注意的是在层级更高的子表达式中已进行转换的,就无需再次转换,判断出该子表达式中尚未转换的部分为['!',],对该部分转换得到(?!.*.*)。再从该层级列表中获取子表达式['疼','|','痛'],将其转换为((疼)|(痛))。最后从该层级列表中获取子表达式[['疼','|','痛'],'&',['!',['不#疼#5','|','不#痛#5']]],确定其中尚未转换的部分为[,'&',],将其转换为'((?=.*)(^.*)).*'。
[0100]
最后将得到的每个子正则表达式拼接为原始逻辑表达式对应的正则表达式。例如,将上述得到的各子正则表达式拼接为原始逻辑表达式对应的正则表达式{'痛感明显':'((?=.*((疼)|(痛)))(^(?!.*((不(?=.{0,5}?疼)(.*?)疼)|(不(?=.{0,5}?痛)(.*?)痛))).*)).*'}。
[0101]
通过上述方式自动将用户输入的原始逻辑表达式转换为对应的正则表达式后,对该正则表达式进行编译,然后根据编译后的正则表达式在待匹配的文本库中进行文本匹配。
[0102]
例如,对于正则表达式{'痛感明显':'((?=.*((疼)|(痛)))(^(?!.*((不(?=.{0,5}?疼)(.*?)疼)|(不(?=.{0,5}?痛)(.*?)痛))).*)).*'},进行文本匹配时“今天打针不是特别的疼”不会命中。而“今天打针的医生不仅态度友好手法还特别专业,但我依然感觉很痛”就会命中。
[0103]
为了便于理解本技术正则表达式的转换过程,下面结合附图进行说明。如图2所示。a1:从正则转换接口接收用户编辑的原始逻辑表达式。a2:生成原始逻辑表达式对应的层级列表,该层级列表中包括按照逻辑层级的预设顺序排列的多个子表达式。a3:从层级列表中当前层级最高的至少一个子表达式中随机获取一个子表达式。a4:判断当前的子表达式中是否包含预设元字符映射表中配置的预设符号,如果是,则执行步骤a5,如果否,则执行步骤a6。a5:根据预设符号对应的替换规则,将子表达式中的预设符号替换为预设符号对应的元字符,得到子表达式对应的子正则表达式。a6:从层级列表中删除当前子表达式。a7:判断层级列表中是否还存在子表达式,如果是,返回步骤a3,如果否,则执行步骤a8。a8:将得到的每个子正则表达式拼接为原始逻辑表达式对应的正则表达式。
[0104]
在本技术实施例中,用户可以个性化地编辑原始逻辑表达式,设备自动将用户输入的原始逻辑表达式转换为对应的正则表达式。实现自动生成满足用户逻辑需求的正则表达式,生成速度快,准确性高,能够生成逻辑层级多层嵌套的复杂的正则表达式,如生成“有且不能有
……”
,“不能有但当且仅当在有
……
时可以有”等复杂逻辑表达对应的正则表达式。而且能快速生成大量正则表达式,能够满足线上文本匹配的时效性需求,可以实现字级、词级、句式级等级别随意组合的文本匹配,无需分布匹配,提高了文本匹配效率。
[0105]
本技术实施例还提供一种正则表达式转换装置,该用于执行上述任一实施例提供的正则表达式转换方法。如图3所示,该装置包括:
[0106]
获取模块201,用于获取原始逻辑表达式;
[0107]
生成模块202,用于根据原始逻辑表达式包括的各逻辑符号的运算优先级,生成原始逻辑表达式对应的层级列表;
[0108]
转换模块203,用于根据层级列表和预设元字符映射表,将原始逻辑表达式转换为对应的正则表达式。
[0109]
生成模块202,用于从原始逻辑表达式中获取常量数组和常量数组对应的逻辑表达式;根据常量数组和逻辑表达式,生成原始逻辑表达式对应的层级列表。
[0110]
生成模块202,用于将逻辑表达式中的常量标识符替换为常量数组中对应的常量字符,得到常量逻辑表达式;根据常量逻辑表达式包括的各逻辑符号和括号,将常量逻辑表达式拆分为多个子表达式;根据各逻辑符号的运算优先级和多个子表达式,生成原始逻辑表达式对应的层级列表。
[0111]
生成模块202,用于分别确定每个子表达式中需执行的逻辑符号;根据每个子表达式中需执行的逻辑符号的运算优先级及每个子表达式中的括号在常量逻辑表达式中所处的括号层级,分别确定每个子表达式对应的逻辑层级;按照逻辑层级的预设顺序,对每个子表达式排序,得到原始逻辑表达式对应的层级列表。
[0112]
转换模块203,用于根据预设元字符映射表,分别将层级列表包括的各子表达式转换为子正则表达式;将得到的每个子正则表达式拼接为原始逻辑表达式对应的正则表达式。
[0113]
转换模块203,用于从层级列表中当前层级最高的至少一个子表达式中随机获取一个子表达式;根据预设元字符映射表,将获取的子表达式转换为对应的子正则表达式;从层级列表中删除获取的子表达式,返回执行从层级列表中当前层级最高的至少一个子表达式中随机获取一个子表达式的操作,循环执行直至层级列表中不再包含子表达式为止。
[0114]
转换模块203,用于判断获取的子表达式中是否包含预设元字符映射表中配置的预设符号;如果是,则从预设元字符映射表中获取预设符号对应的元字符及替换规则;根据预设符号对应的替换规则,将子表达式中的预设符号替换为预设符号对应的元字符,得到子表达式对应的子正则表达式。
[0115]
该装置还包括:匹配模块,用于对原始逻辑表达式对应的正则表达式进行编译;根据编译后的正则表达式进行文本匹配。
[0116]
本技术的上述实施例提供的正则表达式转换装置与本技术实施例提供的正则表达式转换方法出于相同的发明构思,具有与其存储的应用程序所采用、运行或实现的方法相同的有益效果。
[0117]
本技术实施方式还提供一种电子设备,以执行上述正则表达式转换方法。请参考图4,其示出了本技术的一些实施方式所提供的一种电子设备的示意图。如图4所示,电子设备8包括:处理器800,存储器801,总线802和通信接口803,所述处理器800、通信接口803和存储器801通过总线802连接;所述存储器801中存储有可在所述处理器800上运行的计算机程序,所述处理器800运行所述计算机程序时执行本技术前述任一实施方式所提供的正则表达式转换方法。
[0118]
其中,存储器801可能包含高速随机存取存储器(ram:random access memory),也可能还包括非不稳定的存储器(non

volatile memory),例如至少一个磁盘存储器。通过至少一个通信接口803(可以是有线或者无线)实现该装置网元与至少一个其他网元之间的通信连接,可以使用互联网、广域网、本地网、城域网等。
[0119]
总线802可以是isa总线、pci总线或eisa总线等。所述总线可以分为地址总线、数据总线、控制总线等。其中,存储器801用于存储程序,所述处理器800在接收到执行指令后,执行所述程序,前述本技术实施例任一实施方式揭示的所述正则表达式转换方法可以应用于处理器800中,或者由处理器800实现。
[0120]
处理器800可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器800中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器800可以是通用处理器,包括中央处理器(central processing unit,简称cpu)、网络处理器(network processor,简称np)等;还可以是数字信号处理器(dsp)、专用集成电路(asic)、现成可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本技术实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本技术实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,
可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器801,处理器800读取存储器801中的信息,结合其硬件完成上述方法的步骤。
[0121]
本技术实施例提供的电子设备与本技术实施例提供的正则表达式转换方法出于相同的发明构思,具有与其采用、运行或实现的方法相同的有益效果。
[0122]
本技术实施方式还提供一种与前述实施方式所提供的正则表达式转换方法对应的计算机可读存储介质,请参考图5,其示出的计算机可读存储介质为光盘30,其上存储有计算机程序(即程序产品),所述计算机程序在被处理器运行时,会执行前述任意实施方式所提供的正则表达式转换方法。
[0123]
需要说明的是,所述计算机可读存储介质的例子还可以包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他光学、磁性存储介质,在此不再一一赘述。
[0124]
本技术的上述实施例提供的计算机可读存储介质与本技术实施例提供的正则表达式转换方法出于相同的发明构思,具有与其存储的应用程序所采用、运行或实现的方法相同的有益效果。
[0125]
需要说明的是:
[0126]
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本技术的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的结构和技术,以便不模糊对本说明书的理解。
[0127]
类似地,应当理解,为了精简本技术并帮助理解各个发明方面中的一个或多个,在上面对本技术的示例性实施例的描述中,本技术的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下示意图:即所要求保护的本技术要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本技术的单独实施例。
[0128]
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本技术的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0129]
以上所述,仅为本技术较佳的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献