掌桥专利:专业的专利平台
掌桥专利
首页

一种字符串匹配方法、装置、设备及可读存储介质

文献发布时间:2023-06-19 10:32:14


一种字符串匹配方法、装置、设备及可读存储介质

技术领域

本申请涉及计算机技术领域,特别涉及一种字符串匹配方法、装置、设备及可读存储介质。

背景技术

目前,可以利用bit-split模型在存储设备中通过硬件的方式进行字符串的搜索。但bit-split模型在每个时钟周期内只能处理一个字符,即一个byte的数据。为此,在bit-split模型的基础上增加了Hawk架构,从而使得每个时钟周期内可以处理多个byte的数据,但是每多处理一个byte的数据,就会消耗更多的硬件资源。并且,Hawk架构不支持特殊字符的处理,使得应用比较受限制。

为了支持特殊字符的处理,后来又出现了HARE(Hardware Accelerator forRegular Expressions)架构,该HARE架构支持部分特殊字符的处理,例如“+”、“*”等。但是HARE架构在使用上有很多限制。比如:不支持某些特殊字符的组合,在实际的数据匹配中不够灵活。具体而言,HARE架构对于每个子字符串(component)而言,只支持拥有一个前置子字符串的情况,且只允许每个子字符串的长度为1。在实际的正则表达式中,经常出现某个子字符串拥有多个前置子字符串的情况。因此HARE架构在实际的应用中不够灵活,支持的正则表达式类型较少。

前置子字符串是指:对某个子字符串而言,允许出现在其前面的子字符串,其不一定是排列在某个子字符串前面的子字符串。例如:正则表达式[ab][bc]+d?efc{2}被分解出5个子字符串,分别是[ab]、[bc]+、d?、ef、c{2}。对于子字符串ef而言,其前面的d?表示d可有可无(即该正则表达式中可以没有d这个字符),故[bc]+和d?都是ef的前置子字符串。因此子字符串ef有两个前置子字符串。此示例中的ef的长度为2,故无法使用HARE架构进行搜索匹配。

因此,如何提高字符串匹配的灵活性和通用性,是本领域技术人员需要解决的问题。

发明内容

有鉴于此,本申请的目的在于提供一种字符串匹配方法、装置、设备及可读存储介质,以提高字符串匹配的灵活性和通用性。其具体方案如下:

第一方面,本申请提供了一种字符串匹配方法,包括:

获取待匹配字符、子字符串、以及所述子字符串的匹配信息;所述匹配信息包括:索引、字符重复次数取值范围、长度、前置子字符串的个数和前置标记、重复标记、初始标记;

基于所述初始标记、目标结果、所述重复标记和历史计数取值范围确定计数使能信号;

根据所述计数使能信号确定当前计数取值范围;

若所述当前计数取值范围与所述字符重复次数取值范围存在重叠,则确定所述待匹配字符与所述子字符串匹配成功;

其中,所述目标结果为不同目标值的或运算结果;所述不同目标值包括:所述子字符串的每个前置子字符串与字符i-L的匹配结果值,i为所述待匹配字符的索引,L为所述长度;所述历史计数取值范围为:所述待匹配字符的前置字符与所述子字符串的匹配结果,对应的计数取值范围。

优选地,所述基于所述初始标记、目标结果、所述重复标记和历史计数取值范围确定计数使能信号,包括:

获取所述历史计数取值范围中的最小数值和最大数值;

分别确定所述最小数值对应的第一标记,以及所述最大数值对应的第二标记;

将所述第一标记与所述重复标记进行与运算,获得第一与运算结果;将所述第二标记与所述重复标记进行与运算,获得第二与运算结果;

将所述第一与运算结果和所述初始标记、所述目标结果进行或运算,获得第一或运算结果;将所述第二与运算结果和所述初始标记、所述目标结果进行或运算,获得第二或运算结果;

将所述第一或运算结果确定为所述计数使能信号中的最小值使能信号,将所述第二或运算结果确定为所述计数使能信号中的最大值使能信号。

优选地,所述分别确定所述最小数值对应的第一标记,以及所述最大数值对应的第二标记,包括:

若所述最小数值大于0,则确定所述第一标记为1;否则,确定所述第一标记为0;

若所述最大数值大于0,则确定所述第二标记为1;否则,确定所述第二标记为0。

优选地,所述根据所述计数使能信号确定当前计数取值范围,包括:

若所述最小值使能信号和目标向量有效,且所述待匹配字符与所述子字符串的前一个子字符串的匹配结果无效,则确定所述当前计数取值范围中的最小值为所述最小数值递增1;否则,确定所述当前计数取值范围中的最小值为0;目标向量有效表示连续的L个字符均顺序出现在所述子字符串中,L为所述长度;L个字符包括所述待匹配字符和所述待匹配字符之前的L-1个字符;

若所述最大值使能信号和目标向量有效,则确定所述当前计数取值范围中的最大值为所述最大数值递增1;否则,确定所述当前计数取值范围中的最大值为0。

优选地,还包括:

若所述子字符串的终止标记无效,则进行下一轮匹配;

若所述子字符串的终止标记有效,则结束匹配流程。

优选地,还包括:

若所述当前计数取值范围与所述字符重复次数取值范围不存在重叠,则确定所述待匹配字符与所述子字符串匹配不成功。

优选地,所述目标结果的计算公式为:

TMP

其中,L为所述长度,i为所述待匹配字符的索引,j为所述索引,1、2…k为所述子字符串的各个前置子字符串的前置标记;

TMP

RMV[i-L][j-1]为所述子字符串的第一个前置子字符串与所述字符i-L的匹配结果值;

RMV[i-L][j-2]为所述子字符串的第二个前置子字符串与所述字符i-L的匹配结果值;

RMV[i-L][j-k]为所述子字符串的第k个前置子字符串与所述字符i-L的匹配结果值。

第二方面,本申请提供了一种字符串匹配装置,包括:

获取模块,用于获取待匹配字符、子字符串、以及所述子字符串的匹配信息;所述匹配信息包括:索引、字符重复次数取值范围、长度、前置子字符串的个数和前置标记、重复标记、初始标记;

确定模块,用于基于所述初始标记、目标结果、所述重复标记和历史计数取值范围确定计数使能信号;

计数模块,用于根据所述计数使能信号确定当前计数取值范围;

匹配模块,用于若所述当前计数取值范围与所述字符重复次数取值范围存在重叠,则确定所述待匹配字符与所述子字符串匹配成功;

其中,所述目标结果为不同目标值的或运算结果;所述不同目标值包括:所述子字符串的每个前置子字符串与字符i-L的匹配结果值,i为所述待匹配字符的索引,L为所述长度;所述历史计数取值范围为:所述待匹配字符的前置字符与所述子字符串的匹配结果,对应的计数取值范围。

第三方面,本申请提供了一种字符串匹配设备,包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序,以实现前述公开的字符串匹配方法。

第四方面,本申请提供了一种可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述公开的字符串匹配方法。

通过以上方案可知,本申请提供了一种字符串匹配方法,包括:获取待匹配字符、子字符串、以及所述子字符串的匹配信息;所述匹配信息包括:索引、字符重复次数取值范围、长度、前置子字符串的个数和前置标记、重复标记、初始标记;基于所述初始标记、目标结果、所述重复标记和历史计数取值范围确定计数使能信号;根据所述计数使能信号确定当前计数取值范围;若所述当前计数取值范围与所述字符重复次数取值范围存在重叠,则确定所述待匹配字符与所述子字符串匹配成功;其中,所述目标结果为不同目标值的或运算结果;所述不同目标值包括:所述子字符串的每个前置子字符串与字符i-L的匹配结果值,i为所述待匹配字符的索引,L为所述长度;所述历史计数取值范围为:所述待匹配字符的前置字符与所述子字符串的匹配结果,对应的计数取值范围。

可见,本申请在匹配字符串的过程中,针对每个子字符串,提出了如下匹配信息:索引、字符重复次数取值范围、长度、前置子字符串的个数和前置标记、重复标记、初始标记。由于本申请在计算计数使能信号所用到的目标结果为不同目标值的或运算结果;而不同目标值包括:子字符串的每个前置子字符串与字符i-L的匹配结果值,因此在计算计数取值范围(即MAX和MIN)时,本申请使用实际的子字符串长度和前置子字符串的个数进行了计算,故可根据每个子字符串实际拥有的子字符串长度和前置子字符串的个数来计算MAX和MIN,不受一个前置子字符串和子字符串的长度为1的限制,使得匹配更为灵活。可见,本申请能够支持拥有多个前置子字符串的搜索匹配,并且支持子字符串的长度大于1的情况,使得在实际的数据搜索中更加灵活,支持更多的正则表达式,提高了字符串匹配的灵活性和通用性,更接近于真实的grep算法(一种软件搜索方法)。

相应地,本申请提供的一种字符串匹配装置、设备及可读存储介质,也同样具有上述技术效果。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请公开的一种字符串匹配方法流程图;

图2为本申请公开的一种现有HARE架构的硬件结构示意图;

图3为本申请公开的一种IMV取值示意图;

图4为本申请公开的一种MIN_EN和MAX_EN取值示意图;

图5为本申请公开的一种MIN和MAX取值示意图;

图6为本申请公开的一种RMV取值示意图;

图7为本申请公开的一种字符串匹配装置示意图;

图8为本申请公开的一种字符串匹配设备示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

目前,HARE架构对于每个子字符串而言,只支持拥有一个前置子字符串的情况,且只允许每个子字符串的长度为1。在实际的正则表达式中,经常出现某个子字符串拥有多个前置子字符串的情况。因此HARE架构在实际的应用中不够灵活,支持的正则表达式类型较少。为此,本申请提供了一种字符串匹配方案,能够支持拥有多个前置子字符串的搜索匹配,并且支持子字符串的长度大于1的情况,使得在实际的数据搜索中更加灵活,支持更多的正则表达式,提高了字符串匹配的灵活性和通用性。

为了更清楚地介绍本申请,现对现有HARE架构的匹配过程介绍如下。

现有的HARE架构计算MIN_EN[i][j]和MAX_EN[i][j]的程序代码如下:

for i=1to W-1do(i的取值范围是大于1小于W-1)

for j=1to S-1do(j的取值范围是大于1小于S-1)

MIN_EN[i][j]=RMV[i-1][j-1]||MIN[i-1][j]>0;

MAX_EN[i][j]=RMV[i-1][j-1]||MAX[i-1][j]>0;

end for

end for

可见,在现有匹配过程中,MIN_EN[i][j]或MAX_EN[i][j]是两个中间结果(RMV[i-1][j-1]和MAX[i-1][j]>0)的或运算结果。并且,RMV[i-1][j-1]仅表示字符i-1与子字符串j-1的匹配情况,即:限制子字符串的长度为1,默认子字符串j仅有一个前置子字符串。i-1中的1表示子字符串j的长度。j-1中的1表示子字符串j的前置子字符串j-1的标记。

现有的HARE架构计算MIN[i][j]的程序代码如下:

for i=1to W-1do

for j=1to S-1do

if MIN EN[i][j]&IMV[i][j]then

MIN[i][j]=RMV[i][j-1]?0:MIN[i-1][j]+1;

end if

end for

end for

现有的HARE架构计算MAX[i][j]的程序代码如下:

for i=1to W-1do

for j=1to S-1do

if MAX_EN[i][j]&IMV[i][j]then

MAX[i][j]=MAX[i-1][j]+1;

end if

end for

end for

可见,在现有匹配过程中,由于MIN_EN[i][j]或MAX_EN[i][j]的计算子字符串的长度为1和仅有一个前置子字符串的限制,导致MIN[i][j]和MAX[i][j]的计算不能考虑到诸多情况,也受子字符串的长度为1和仅有一个前置子字符串的限制,因此HARE架构在实际的应用中不够灵活,支持的正则表达式类型较少。

实际上,本申请是在现有HARE架构和CRU(Counter-based Reduction Unit)的min-max匹配算法的基础上进行改进得到的,可称为ACMU(Advanced Counter-based MatchUnit)匹配算法。

为使本申请方案完整,现对HARE架构的硬件结构介绍如下。HARE架构包括编译器(compiler)和硬件(hardware)两部分。编译器用于将用户输入的正则表达式进行解析、划分,以得到待匹配的子字符串。

请参见图2,HARE架构的硬件结构包括:存储器、CCU(Character Class Unit)模块、算法模块(Pattern Automatas)、IMU(Intermediate Match Unit)模块、CRU(Counter-based Reduction Unit)模块。

存储器中存有大量待匹配字符。Hardware首先将某些待匹配字符和正则表达式的解析结果读取至内存,以便CCU模块对待匹配字符进行分组,之后利用算法模块中的bit-split状态机对待匹配字符和子字符串进行处理,并将结果输入IMU模块,以得到IMV向量。IMV向量则进入CRU模块,在CRU模块中根据min-max匹配算法,完成最终的匹配,并输出匹配结果。

其中,IMV向量是一个S行W列的矩阵。IMV[i][j]表示字符i和子字符串j的匹配情况。当j在字符i的位置刚好结束,则IMV[i][j]等于1,否则IMV[i][j]等于0。如果子字符串j的长度为1,那么当字符i出现在j中是,IMV[i][j]有效,取值为1。若子字符串j的长度大于1,只有当连续的多个待匹配字符分别均在子字符串j出现,IMV[i][j]才有效。例如:针对子字符串ef,当连续的两个连续的待匹配字符分别是e和f时,且当前的索引i对应字符f,索引j对应子字符串ef时,即:连续的e和f均顺序出现在子字符串ef中,IMV[i][j]才有效。假设两个连续待匹配字符分别是a和f,那么对子字符串ef而言,IMV[i][j]是无效的。因此IMV[i][j]有效表示:当前待匹配字符,以及当前待匹配字符之前连续的L-1个字符均顺序出现在当前子字符串中,其中,L为当前子字符串中的字符个数。

min-max匹配算法定义了两个计数器矩阵MIN和MAX,以及这两个计数器矩阵对应的使能信号矩阵MIN_EN和MAX_EN。MIN_EN[i][j]等于1,表示允许MIN[i][j]计数。MAX_EN[i][j]等于1,表示允许MAX[i][j]计数。还定义了RMV匹配向量矩阵,用于表示某一字符和某一子字符串的匹配情况。

为了流水化处理,每一个时钟周期内,前级模块(IMU)向CRU模块输入一个S行W列的IMV矩阵。在该时钟周期内,必须完成MIN_EN、MAX_EN、MIN、MAX和RMV等所有矩阵值的计算,从而实时地输出匹配结果。本申请正是对MIN_EN、MAX_EN、MIN、MAX和RMV等的计算过程进行改进。

参见图1所示,本申请实施例公开了一种字符串匹配方法,包括:

S101、获取待匹配字符、子字符串、以及子字符串的匹配信息;匹配信息包括:索引、字符重复次数取值范围、长度、前置子字符串的个数和前置标记、重复标记、初始标记。

需要说明的是,待匹配字符可以从硬件存储器中读取,子字符串从用户输入的正则表达式(即待匹配的字符串)中划分得到。划分任一个正则表达式后,即可获得至少一个子字符串。针对每个子字符串,可按照表1确定相对应的匹配信息。索引为各个子字符串的标记。

初始标记用于标记某个子字符串是否为待搜索正则表达式分解出的第一个子字符串。重复标记用于表示某个子字符串是否允许重复出现。子字符串的长度即:子字符串中的字符个数。

具体的,子字符串的匹配信息还可以包括其他信息,具体可参照表1。

表1

在表1中,将正则表达式[ab][bc]+d?efc{2}划分为5个子字符串,分别是[ab]、[bc]+、d?、ef、c{2}。其中,[ab]是该正则表达式的第一个子字符串,故初始标记有效,记为1;终止标记无效,记为0;[ab]表示ab任选其一即可,故其长度为1;正则表达式的第一个子字符串[ab]没有前置子字符串,故前置子字符串的个数取值0。(BL,BU)为字符重复次数取值范围,针对[ab]此子字符串,无论待匹配字符是a还是b,都认为是匹配上了,故针对该子字符串,其重复次数取值范围为(1,1)。

对于子字符串ef而言,其前面的d?可以没有,也可以有,故[bc]+和d?都是其的前置子字符串,因此子字符串ef有两个前置子字符串,且ef长度为2。对于子字符串c{2}而言,其表示c重复两次,故其重复标记有效,记为1;且c{2}是正则表达式[ab][bc]+d?efc{2}的最后一个子字符串,故初始标记无效,记为0;终止标记有效,记为1;每次只有一个c字符,故c{2}长度为1。

表1中的其他子字符串以此类推,在此不再赘述。

在本实施例中,多个正则表达式可以并行进行搜索匹配。如表1所示,j=0到j=4属于第一个正则表达式。j=5到j=7属于第二个正则表达式。这两个正则表达式共享待匹配字符。请参见图3-图6,对于第一个正则表达式匹配过程而言,它从第一个子字符串开始匹配,直到出现其终止标记。对于第二个正则表达式匹配过程,它同样是从其第一个子字符串开始匹配,直到出现其终止标记。两个匹配过程完全独立,但是输入的字符(索引i)是分别送给这两个匹配过程的,即并行搜索。

S102、基于初始标记、目标结果、重复标记和历史计数取值范围确定计数使能信号。

S103、根据计数使能信号确定当前计数取值范围。

其中,目标结果为不同目标值的或运算结果;所述不同目标值包括:所述子字符串的每个前置子字符串与字符i-L的匹配结果值,i为所述待匹配字符的索引,L为所述长度;历史计数取值范围为:待匹配字符的前置字符与子字符串的匹配结果,对应的计数取值范围。

子字符串用j表示,待匹配字符用i表示,则在一种具体实施方式中,目标结果的计算公式为:

TMP

其中,L为子字符串j的长度,i为待匹配字符的索引,j为索引,1、2…k为子字符串的各个前置子字符串的前置标记;TMP

本实施例使用实际的子字符串长度和前置子字符串的个数确定了计数使能信号,使得可根据每个子字符串实际拥有的子字符串长度和前置子字符串的个数来计算MAX和MIN,不受一个前置子字符串个数和子字符串的长度为1的限制,使得匹配更为灵活。

具体的,计数器需要计最大值和最小值,故计数使能信号包括:最小值使能信号和最大值使能信号。相应的,当前计数取值范围是指由最大值和最小值构成的区间。

在一种具体实施方式中,基于初始标记、目标结果、重复标记和历史计数取值范围确定计数使能信号,包括:获取历史计数取值范围中的最小数值和最大数值;分别确定最小数值对应的第一标记,以及最大数值对应的第二标记;将第一标记与重复标记进行与运算,获得第一与运算结果;将第二标记与重复标记进行与运算,获得第二与运算结果;将第一与运算结果和初始标记、目标结果进行或运算,获得第一或运算结果;将第二与运算结果和初始标记、目标结果进行或运算,获得第二或运算结果;将第一或运算结果确定为计数使能信号中的最小值使能信号,将第二或运算结果确定为计数使能信号中的最大值使能信号。

在一种具体实施方式中,分别确定最小数值对应的第一标记,以及最大数值对应的第二标记,包括:若最小数值(即MIN[i-1][j])大于0,则确定第一标记为1;否则,确定第一标记为0;若最大数值(即MAX[i-1][j])大于0,则确定第二标记为1;否则,确定第二标记为0。

例如:子字符串用j表示,待匹配字符用i表示,则匹配i和j的过程中,最小值使能信号用MIN_EN[i][j]表示,最大值使能信号用MAX_EN[i][j]表示,那么MIN_EN[i][j]和MAX_EN[i][j]可以按照如下程序计算。

for i=0to W-1do

for j=0to S-1do

TMP=0;

for k=1to CS[j]do

TMP=TMP||RMV[i-L[j]][j-k];

End for

MIN_EN[i][j]=IV[j]||TMP||(MIN[i-1][j]>0&RV[j]);

MAX_EN[i][j]=IV[j]||TMP||(MAX[i-1][j]>0&RV[j]);

end for

end for

其中,W为每个时钟读取的待匹配字符的个数,S为在编译阶段产生的子字符串的总个数。目标结果TMP=0表示:初始的目标结果TMP取值为0,由于第一个子字符串没有前置子字符串,故第一个子字符串没有对应的RMV[i-L[j]][j-k],因此目标结果TMP赋值为0。L[j]为子字符串j的长度,k在1~CS[j]之间取值。IV[j]为子字符串j的初始标记,RV[j]为子字符串j的重复标记。||为或运算符,&为与运算符。MAX[i-1][j]为字符i-1与j匹配过程中计算得到的计数取值范围中的最大数值。MIN[i-1][j]为字符i-1与j匹配过程中计算得到的计数取值范围中的最小数值。

基于MIN_EN[i][j]=IV[j]||TMP||(MIN[i-1][j]>0&RV[j])可知,当初始标记IV[j]有效时,不管TMP和(MIN[i-1][j]>0&RV[j])如何取值,MIN_EN[i][j]就有效,可以记为1。若MIN_EN[i][j]无效,则可以记为0。

同理,基于MAX_EN[i][j]=IV[j]||TMP||(MAX[i-1][j]>0&RV[j])可知:当初始标记IV[j]有效时,不管TMP和(MIN[i-1][j]>0&RV[j])如何取值,MAX_EN[i][j]就有效,可以记为1。若MAX_EN[i][j]无效,则可以记为0。

若MIN_EN[i][j]等于1或者MAX_EN[i][j]等于1,表示字符i可能被j消耗,即:i和j匹配。有3种情况表示i和j匹配。故MIN_EN[i][j]或MAX_EN[i][j]等于IV[j]、TMP和MIN[i-1][j]>0&RV[j]这三种情况的逻辑或。

第一情况:j是待搜索的正则表达式分解出的第一个子字符串,那么初始标记IV[j]有效,这种情况表示:当前可以用存储器中的任意待匹配字符开始进行匹配。此时MIN_EN[i][j]和MAX_EN[i][j]有效。

第二情况:子字符串j的所有可能的前置子字符串中,至少有一个前置子字符串在字符i-L[j]的位置匹配到了,即:j的至少一个前置子字符串和字符i-L[j]完成了匹配。那么,字符i可能是子字符串j需要消耗的第一个字符。这里假设子字符串j的长度为L[j],并且有CS[j]个前置子字符串,那么需要判断子字符串j的每个前置子字符串与字符i-L[j]的匹配情况。即:分别计算RMV[i-L][j-1]、RMV[i-L][j-2]…RMV[i-L][j-k]。对这些RMV进行逻辑或,即可获得当前的TMP,其表示:子字符串j的每个前置子字符串与字符i-L[j]的匹配情况的或运算结果。

第三情况:字符i-1已经被子字符串j消耗了(即i-1与j匹配),并且子字符串j是允许重复的,即RV[j]有效,记为1。那么,字符i可能是子字符串j的一个重复匹配。

确定MIN_EN[i][j]和MAX_EN[i][j]是否有效后,便可基于MIN_EN[i][j]和MAX_EN[i][j]的有效情况确定当前计数取值范围。在一种具体实施方式中,根据计数使能信号确定当前计数取值范围,包括:若最小值使能信号和目标向量(即IMV[i][j])有效,且待匹配字符与子字符串的前一个子字符串的匹配结果无效,则确定当前计数取值范围中的最小值为最小数值递增1;否则,确定当前计数取值范围中的最小值为0;目标向量有效表示连续的L个字符均顺序出现在所述子字符串中,L为所述长度(即所述子字符串中的字符的个数);L个字符包括所述待匹配字符和所述待匹配字符之前的L-1个字符;若最大值使能信号和目标向量有效,则确定当前计数取值范围中的最大值为最大数值递增1;否则,确定当前计数取值范围中的最大值为0。

例如:子字符串用j表示,待匹配字符用i表示,则匹配i和j的过程中,当前计数取值范围中的最小值用MIN[i][j]表示,那么MIN[i][j]可以按照如下程序计算。

for i=0to W-1do

for j=0to S-1do

if IV[j]then

MIN[i][j]=0;

else if MIN_EN[i][j]&IMV[i][j]then

MIN[i][j]=RMV[i][j-1]?0:MIN[i-1][j]+1;

else

MIN[i][j]=0;

end if

end for

end for

其中,若MIN_EN[i][j]和IMV[i][j]有效,且RMV[i][j-1]无效,此时MIN[i][j]在MIN[i-1][j]的基础上递增1。若RMV[i][j-1]有效,则MIN[i][j]取值为0。RMV[i][j-1]有效表示:字符i和子字符串j-1已经完成了匹配,也就是字符i被子字符串j-1消耗,故字符i不能被子字符串j再消耗,因此MIN[i][j]置0。

例如:子字符串用j表示,待匹配字符用i表示,则匹配i和j的过程中,当前计数取值范围中的最大值用MAX[i][j]表示,那么MAX[i][j]可以按照如下程序计算。

for i=0to W-1do

for j=0to S-1do

if MAX_EN[i][j]&IMV[i][j]then

MAX[i][j]=MAX[i-1][j]+1;

else

MAX[i][j]=0;

end if

end for

end for

其中,若MAX_EN[i][j]和IMV[i][j]有效,则MAX[i][j]在MAX[i-1][j]的基础上递增1;否则,MAX[i][j]置0。

S104、若当前计数取值范围与字符重复次数取值范围存在重叠,则确定待匹配字符与子字符串匹配成功。

本实施例计算RMV的代码示例如下:

for i=1to W-1do

for j=1to S do

RMV[i][j]=MAX[i][j]>=BL[i][j]&MIN[i][j]<=BU[i][j];

end for

end for

其中,当MIN[i][j]和MAX[i][j]组成的范围与BL和BU组成的范围有交集时,则RMV[i][j]有效,表示j和i完成了一次匹配。当待搜索的正则表达式所分解出的所有子字符串中最后一个子字符串的RMV有效,则表示完成了正则表达式的搜索匹配。

需要说明的是,S101-S104描述的是任一个字符与任一个子字符串的匹配过程。

在一种具体实施方式中,还包括:若当前计数取值范围与字符重复次数取值范围不存在重叠,则确定待匹配字符与子字符串匹配不成功。

确定当前计数取值范围后,可判断当前计数取值范围与字符重复次数取值范围是否存在重叠,若存在重叠,则确定i和j匹配成功;否则,确定i和j匹配不成功。

在完成i和j的匹配后,可基于子字符串的终止标记确定当前正则表达式是否完成搜索。在一种具体实施方式中,若子字符串的终止标记无效,则进行下一轮匹配;若子字符串的终止标记有效,则结束当前正则表达式的匹配流程。下一轮匹配可以是i和j+1的匹配,也可以是i+1和j的匹配。

可见,本申请实施例在匹配字符串的过程中,针对每个子字符串,提出了如下匹配信息:索引、字符重复次数取值范围、长度、前置子字符串的个数和前置标记、重复标记、初始标记。由于本申请在计算计数使能信号所用到的目标结果为不同目标值的或运算结果;而不同目标值包括:子字符串的每个前置子字符串与字符i-L的匹配结果值,因此在计算计数取值范围(即MAX和MIN)时,本申请使用实际的子字符串长度和前置子字符串的个数进行了计算,故可根据每个子字符串实际拥有的子字符串长度和前置子字符串的个数来计算MAX和MIN,不受一个前置子字符串和子字符串的长度为1的限制,使得匹配更为灵活。可见,本申请能够支持拥有多个前置子字符串的搜索匹配,并且支持子字符串的长度大于1的情况,使得在实际的数据搜索中更加灵活,支持更多的正则表达式,提高了字符串匹配的灵活性和通用性,更接近于真实的grep算法。

如上述实施例,本申请使用ACMU算法进行正则表达式搜索所用的架构与现有HARE架构类似,需要由编译器和硬件部分共同完成。其中,硬件部分的结构可参照图2。编译器可将待搜索的正则表达式解析为如表1所示的各个子字符串和相应的匹配信息,之后便可按照图2所示的结构进行MIN_EN、MAX_EN、MIN、MAX和RMV等的计算。

在ACMU算法中,一个子字符串消耗一个字符,所以如果一个子字符串中有重复字符,就需要相应数量的待匹配字符,而不能用一个字符匹配该子字符串。例如:子字符串c{2}表示出现2个c,因此连续消耗2个字符c,才表示成功匹配了c{2}。

请参照表1所列的两个正则表达式,假设W=4,即每个时钟周期内处理4个字符。假设输入的待匹配字符文本为abcefccgtrak,那么第一个时钟输入abce,第2个时钟的输入为fccg,第3个时钟的输入为trak。每个时钟的输入经过CCU和IMU的处理后,进入ACMU的是相应的IMV向量。

这三个时钟下,各个IMV的取值如图3所示。在图3中,各个格子中记录的某一字符与某一子字符串匹配时的IMV取值。例如:针对字符a和子字符串[ab],其IMV([ab])=1。针对字符a和子字符串[bc],其IMV([bc])=0。

其他以此类推.

在第一个clock周期内,由于子字符串[ab]和子字符串tr分别是正则表达式[ab][bc]+d?efc{2}和tr[ae]ce所分解出的第一个子字符串,即IV[0](0为[ab]的索引)和IV[5](5为tr的索引)都为1,因此MIN_EN[i][0]、MIN_EN[i][5]、MAX_EN[i][0]、MAX_EN[i][5]都为1,如图4所示。

在图4中,各个格子中记录的某一字符与某一子字符串匹配时的MIN_EN和MAX_EN取值。例如:子字符串[ab]的初始标记有效,因此MIN_EN和MAX_EN均有效,故二者均取值为1,因此不管子字符串[ab]与哪个字符匹配,其MIN_EN和MAX_EN都取值为1。

MIN_EN[1][1](字符1与子字符串1匹配时的MIN_EN)和MIN_EN[2][1](字符2与子字符串1匹配时的MIN_EN)为1,是因为子字符串[bc]的长度为1,且其前置子字符串只有一个,并且RMV[0][0]和RMV[1][0]为1,表示其前一个子字符串[ab]与字符0匹配成功,[ab]与字符1匹配成功。那么当前字符可能是当前子字符串需要消耗的第一个字符。同理,MAX_EN[1][1]和MAX_EN[2][1]为1,如图4所示。

在图5中,各个格子中记录的某一字符与某一子字符串匹配时的MIN和MAX取值。例如:子字符串[ab]与字符a匹配时的MIN取值为0,MAX取值为1。

在第二个clock周期内,由于子字符串ef长度为2,有两个前置向量,其前面既可以是子字符串[bc],也可以是子字符串d?,在计算EN(ef),即MIN_EN[0][3]和MAX_EN[0][3]时,需要遍历其两个前置子字符串在i-2处的RMV值。实际上,在第2个clock的i=0的位置,计算前置子字符串的匹配位置的时候,应该用i=4,即需要加上w值,此时相当于需要使用前一个w窗口(clock)的RMV值。

遍历子字符串ef的两个可能的前置子字符串的RMV的结果为RMV[2][2]||RMV[2][1],由于RMV[2][1]等于1,即RMV([bc])在i=2处等于1,因此EN(ef)等于(1,1)。计算EN(c)在i=2处的值时,由于MIN[1][4]大于0,且RV[4]大于1,即允许重复出现,因此EN(c)在i=2处的等于(1,1),即MIN_EN[2][4]和MAX_EN[2][4]都等于1。由于EN(c)和IMV(c)在i=1和i=2处都有效,因此Count(c)在i=1和i=2处连续递增,Count(c)在i=2处等于(2,2),如图5所示。该范围刚好落在子字符串c的(BL,BU)范围。因此RMV(c)在i=2处等于1,即RMV[2][4]等于1,如图6所示。并且子字符串c为正则表达式[ab][bc]+d?efc{2}所分解出的最后一个子字符串,即表1中MP[4]等于1。因此[ab][bc]+d?efc{2}在此时完成了一个正则表达式的匹配。

在图6中,各个格子中记录的某一字符与某一子字符串匹配时的RMV的取值。例如:子字符串[ab]与字符a匹配时RMV取值为1。

在第三个clock周期内,RMV(tr)和RMV([ae])分别在i=1和i=2处等于1,即RMV[1][5]和RMV[2][6]等于1,如图6所示。但是由于RMV(ce)在i=3处等于0,即RMV[3][7]等于0,所以正则表达式tr[ae]ce没有完成匹配。

可见,本实施例通过扩展HARE架构中的min-max算法,在计算MIN_EN/MAX_EN时,引入初始标记、重复标记、以及前置子字符串的个数CS等,从而可遍历所有前置子字符串的匹配情况。另外,在计算MIN时,引入初始标记,使得从待搜索的正则表达式中分解出的第一个子字符串的MIN的值固定为0。本实施例能够支持拥有多个前置子字符串的情况,并且支持子字符串的长度大于1。使得在实际的数据搜索中更加灵活,可以支持更多场景下的特殊字符的组合使用,支持更多的正则表达式,更接近于真实的grep算法。

下面对本申请实施例提供的一种字符串匹配装置进行介绍,下文描述的一种字符串匹配装置与上文描述的一种字符串匹配方法可以相互参照。

参见图7所示,本申请实施例公开了一种字符串匹配装置,包括:

获取模块701,用于获取待匹配字符、子字符串、以及子字符串的匹配信息;匹配信息包括:索引、字符重复次数取值范围、长度、前置子字符串的个数和前置标记、重复标记、初始标记;

确定模块702,用于基于初始标记、目标结果、重复标记和历史计数取值范围确定计数使能信号;

计数模块703,用于根据计数使能信号确定当前计数取值范围;

匹配模块704,用于若当前计数取值范围与字符重复次数取值范围存在重叠,则确定待匹配字符与子字符串匹配成功;

其中,目标结果为不同目标值的或运算结果;所述不同目标值包括:所述子字符串的每个前置子字符串与字符i-L的匹配结果值,i为所述待匹配字符的索引,L为所述长度;历史计数取值范围为:待匹配字符的前置字符与子字符串的匹配结果,对应的计数取值范围。

在一种具体实施方式中,确定模块包括::

获取单元,用于获取历史计数取值范围中的最小数值和最大数值;

标记确定单元,用于分别确定最小数值对应的第一标记,以及最大数值对应的第二标记;

与运算单元,用于将第一标记与重复标记进行与运算,获得第一与运算结果;将第二标记与重复标记进行与运算,获得第二与运算结果;

或运算单元,用于将第一与运算结果和初始标记、目标结果进行或运算,获得第一或运算结果;将第二与运算结果和初始标记、目标结果进行或运算,获得第二或运算结果;

使能信号确定单元,用于将第一或运算结果确定为计数使能信号中的最小值使能信号,将第二或运算结果确定为计数使能信号中的最大值使能信号。

在一种具体实施方式中,标记确定单元具体用于:

若最小数值大于0,则确定第一标记为1;否则,确定第一标记为0;

若最大数值大于0,则确定第二标记为1;否则,确定第二标记为0。

在一种具体实施方式中,计数模块具体用于:

若最小值使能信号和目标向量有效,且待匹配字符与子字符串的前一个子字符串的匹配结果无效,则确定当前计数取值范围中的最小值为最小数值递增1;否则,确定当前计数取值范围中的最小值为0;目标向量有效表示连续的L个字符均顺序出现在所述子字符串中,L为所述长度;L个字符包括所述待匹配字符和所述待匹配字符之前的L-1个字符;

若最大值使能信号和目标向量有效,则确定当前计数取值范围中的最大值为最大数值递增1;否则,确定当前计数取值范围中的最大值为0。

在一种具体实施方式中,还包括:

迭代模块,用于若子字符串的终止标记无效,则进行下一轮匹配;

终止模块,用于若子字符串的终止标记有效,则结束匹配流程。

在一种具体实施方式中,还包括:

输出模块,用于若当前计数取值范围与字符重复次数取值范围不存在重叠,则确定待匹配字符与子字符串匹配不成功。

在一种具体实施方式中,目标结果的计算公式为:

TMPj=RMV[i-L][j-1]||RMV[i-L][j-2]||…||RMV[i-L][j-k];

其中,L为长度,i为待匹配字符的索引,j为索引,1、2…k为子字符串的各个前置子字符串的前置标记;

TMPj为目标结果;

RMV[i-L][j-1]为子字符串的第一个前置子字符串与字符i-L的匹配结果值;

RMV[i-L][j-2]为子字符串的第二个前置子字符串与字符i-L的匹配结果值;

RMV[i-L][j-k]为子字符串的第k个前置子字符串与字符i-L的匹配结果值。

其中,关于本实施例中各个模块、单元更加具体的工作过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。

可见,本实施例提供了一种字符串匹配装置,该装置能够支持拥有多个前置子字符串的搜索匹配,并且支持子字符串的长度大于1的情况,使得在实际的数据搜索中更加灵活,支持更多的正则表达式,提高了字符串匹配的灵活性和通用性,更接近于真实的grep算法。

下面对本申请实施例提供的一种字符串匹配设备进行介绍,下文描述的一种字符串匹配设备与上文描述的一种字符串匹配方法及装置可以相互参照。

参见图8所示,本申请实施例公开了一种字符串匹配设备,包括:

存储器801,用于保存计算机程序;

处理器802,用于执行所述计算机程序,以实现上述任意实施例公开的方法。

下面对本申请实施例提供的一种可读存储介质进行介绍,下文描述的一种可读存储介质与上文描述的一种字符串匹配方法、装置及设备可以相互参照。

一种可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述实施例公开的字符串匹配方法。关于该方法的具体步骤可以参考前述实施例中公开的相应内容,在此不再进行赘述。

本申请涉及的“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法或设备固有的其它步骤或单元。

需要说明的是,在本申请中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本申请要求的保护范围之内。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的可读存储介质中。

本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

相关技术
  • 一种字符串匹配方法、装置、设备及可读存储介质
  • 一种字符串匹配方法、装置、设备及可读存储介质
技术分类

06120112587177