专利名称:基于正则表达式的字符串匹配方法和装置的制作方法
技术领域:
本发明涉及数据处理领域,特别涉及基于正则表达式的字符串匹配方法和装置。
背景技术:
正则表达式是一种正规的描述字符串模式的方法,可以用来进行文本匹配,具体为在给定的字符串中寻找与给定的正则表达式相匹配的部分。正则表达式由普通字符和元字符组成,普通字符包括数字和大小写的字母,而元字符是具有特殊的含义的字符,例如, “\s”表示任何空白字符,包括空格、制表符、换页符等,”表示除换行元字符“\n”以外的任意字符,表示前面的子表达式重复零次或多次。正则表达式可以用来进行文本匹配,具体为在给定的字符串中寻找和匹配正则表达式相匹配的部分。正则表达式广泛应用在通信行业中,用于对数据流量进行模式匹配检查,例如进行协议解析、病毒检测和业务分类等。在实际应用中,在进行文本匹配时,需要根据不同的匹配内容编写不同的字符串匹配结构,设计过程较为繁琐,而匹配内容的格式一旦改变,就需要重新设计字符串匹配结构,造成维护困难。由此,需要自动根据正则表达式设计进行字符串匹配的方法和装置
发明内容
本发明的目的在于提供易于维护基于正则表达式的字符串匹配方法和装置。本发明公开了一种基于正则表达式的字符串匹配方法,包括步骤100、解析匹配字符串,根据预先设定的段模式分隔符以及字符串格式判断匹配字符串的匹配类型为段模式还是行模式,根据判断得到的匹配类型设置匹配类型标识;步骤200、根据匹配类型标识将匹配字符串按段分割或按行分割为多个子字符串, 对每个子字符串确定正则表达式生成模式,并根据正则表达式生成模式以不同的连接式连接所述子字符串中以预定词组标记标识的词组生成子字符串正则表达式,获得包含至少一个子字符串正则表达式的正则表达式列表;步骤300、根据匹配类型标识对待匹配数据进行按段分割或按行分割获得待匹配子字符串,按子字符串正则表达式逐一地对分割得到的待匹配子字符串进行匹配,输出匹配结果。优选地,匹配类型为段模式是指所述匹配字符串的格式以所述预定的段模式分隔符为界进行重复,匹配类型为行模式是指所述匹配字符串格式为不符合段模式的其它模式。优选地,所述按段分割是以预定段模式分隔符为界截取子字符串,所述按行分割是以换行符为界截取子字符串。优选地,所述正则表达式生成模式包括列模式和非列模式,对于列模式,利用代表至少一个空白字符的连接正则表达式连接词组生成子字符串正则表达式,对于非列模式, 利用代表至少一个非换行符的任意字符的连接则正表达式生成子字符串正则表达式。
优选地,所述步骤100包括步骤101、解析所述匹配字符串;步骤102、判断所述匹配字符串的格式是否以预定的段模式分隔符为界进行重复, 如果是,所述匹配字符串匹配类型为段模式,执行步骤103,如果否,所述匹配字符串匹配类型为行模式,执行步骤104;步骤103、设置所述匹配字符串的匹配类型标识为段模式,结束步骤100流程;步骤104、设置所述匹配字符串的匹配类型标识为行模式,结束100流程。优选地,所述步骤200包括步骤201、判断所述匹配字符串的匹配类型标识为段模式还是行模式,如果为段模式,则执行步骤202,如果为行模式则执行步骤203 ;步骤202、按段模式分隔符将所述匹配字符串分割为多个匹配子字符串,执行步骤 204 ;步骤203、按换行符将所述匹配字符串分割为多个子字符串,执行步骤204 ;步骤204、取出一个未处理的匹配子字符串,根据预定的词组标记提取其中的由词组标记标识的词组和词组间字符;步骤205、根据词组间字符判断所述匹配子字符串的正则表达式生成模式为列模式还是非列模式,如果是列模式,则执行步骤206,如果是非列模式,则执行步骤207 ;步骤206、将在步骤204中提取的词组用表示至少一个空白字符的连接正则表达式连接为子字符串正则表达式,执行步骤208 ;步骤207、将在步骤204中提取的词组用表示至少一个非换行符的任意字符的连接正则表达式连接为子字符串正则表达式,执行步骤208 ;步骤208、将得到的子字符串正则表达式加入正则表达式列表;步骤209、判断是否还有未处理的匹配子字符串,如果有,则执行步骤204,如果没有,则执行步骤210 ;步骤210、结束正则表达式生成。优选地,所述步骤300包括步骤301、判断所述匹配类型标识为段模式还是行模式,如果为段模式,则执行步骤302,如果为行模式则执行步骤303 ;步骤302、将待匹配数据按段分割为待匹配子字符串,执行步骤304 ;步骤303、将待匹配数据按行分割为待匹配子字符串,执行步骤304 ;步骤304、按顺序从所述正则表达式列表中读取一个未处理的子字符串正则表达式;步骤305、用子字符串正则表达式与待匹配子字符串进行匹配;步骤306、判断子字符串匹配是否成功,如果失败执行步骤307,如果成功执行步骤 308 ;步骤307、输出字符串匹配失败,结束匹配流程;步骤308、判断是否还有未处理的子字符串正则表达式,如果有,则执行步骤304, 如果没有,则执行步骤309 ;步骤309、输出字符串匹配成功,结束匹配流程。
本发明还公开了一种基于正则表达式的字符串匹配装置,包括解析模块,用于解析匹配字符串,根据预先设定的段模式分隔符以及字符串格式判断匹配字符串的匹配类型为段模式还是行模式,根据判断得到的匹配类型设置匹配类型标识;正则表达式生成模块,用于根据匹配类型标识将匹配字符串按段分割或按行分割为多个子字符串,对每个子字符串确定正则表达式生成模式,并根据正则表达式生成模式以不同的连接式连接所述子字符串中以预定词组标记标识的词组生成子字符串正则表达式,获得包含至少一个子字符串正则表达式的正则表达式列表;数据匹配模块,用于根据匹配类型标识对待匹配数据进行按段分割或按行分割获得待匹配子字符串,按子字符串正则表达式逐一地对分割得到的待匹配子字符串进行匹配,输出匹配结果。本发明通过不同匹配模式来覆盖所有的字符串匹配形式,通过设置正则表达式生成模式从而简化了字符串匹配结构体的设计过程。使匹配高效,设计简单,维护方便。
图I是本发明的基于正则表达式的字符串匹配方法的流程图;图2是本发明的基于正则表达式的字符串匹配方法的解析子过程的流程图;图3是本发明的基于正则表达式的字符串匹配方法的正则表达式生成子过程的流程图;图4是本发明的基于正则表达式的字符串匹配方法的数据匹配子过程的流程图;图5是本发明的基于正则表达式的字符串匹配装置的框图。
具体实施例方式下面结合附图并通过具体实施方式
来进一步说明本发明的技术方案。本发明实施例根据匹配字符串的排列方式特点,对匹配字符串类型进行分配,根据不同类型进行不同的正则表达式生成和字符串匹配操作,从而实现简化字符串匹配结构的设计过程的目的。其中,本发明实施例根据匹配字符串的分隔特点,将匹配字符串的匹配模式分为行模式和段模式。其中,匹配模式为段模式的匹配字符串中被匹配内容是按照某种固定格式重复出现的,即在整个字符串中字符组合以相同格式重复出现(以特定字符/字符串分隔重复,例如,字符串“123**234**789#”中,内容以为分隔符每三个字符重复出现)。 不具备段模式特点的字符串(即字符串内容不按照特定格式重复)被分类为行模式的字符串。在一个优选实施例中,匹配模式为行模式的字符串可以根据是否存在换行符进一步分为单行模式和多行模式,单行模式的匹配字符串在匹配字符串内没有换行符,匹配字符串只在同一行中出现,而多行模式的匹配字符串内存在至少一个换行符,匹配字符串在多行中出现。本发明按照不同的模式来对匹配字符串进行分割和匹配。同时,本发明实施例在根据匹配字符串生成正则表达式时,还根据字符串中词组的特点,将匹配字符串分为列模式和非列模式。此处所述的词组是字符串中利用词组标记标示的字符组合,例如字符串“$catch$ $it$”,利用“$”作为词组标记标示了两个词组“catch”和“it”,通过这种方式可以在解析时识别字符串中的哪些字符组合是词组。在列模式中,匹配字符串的词组之间仅使用至少一个空白字符(包括空格、制表符等)连接,即匹配字符串的词组在逻辑上是紧密相连的,在相邻词组之间不存在其他字符,例如上述的 “$(^化1!$$^$”就是列模式的字符串。而在非列模式中,匹配字符串的词组之间包括除空白字符外的其它字符,例如“$catched$,$it$”。图I示出了本发明的基于正则表达式的字符串匹配方法的流程图。其具体流程如下步骤100、解析匹配字符串,根据预先设定的段模式分隔符以及字符串格式判断匹配字符串的匹配类型为段模式还是行模式,根据判断得到的匹配类型为匹配字符串设置代表其匹配类型的标识,即匹配类型标识。步骤200、按匹配类型标识将匹配字符串划分为多个子字符串组成的字符串列表, 对每个子字符串确定正则表达式生成模式,并根据正则表达式生成模生成子字符串匹配正则表达式。其中,对于段模式的匹配字符串,将该匹配字符串按分隔符进行分割,对于行模式的匹配字符串,将该匹配字符串按换行符进行分割。分割后,对于每一个子字符串,按预先设定的词组标记解析该子字符串,获得子字符串中的词组以及词组之间的字符,根据所述词组之间的字符判断该子字符串的正则表达式生成类型是列模式还是非列模式,对于列模式的子字符串,在提取得到的词组之间用“\s*”元符号连接形成子字符串正则表达式,对于非列模式的子字符串,在提取得到的词组之间用* ”元符号连接形成子字符串正则表达式,最后将各子字符串正则表达式合并为子字符串正则表达式列表,并将所属匹配类型标识设置到所述正则表达式列表。步骤300、进行数据匹配,获取正则表达式列表的匹配类型标识,根据匹配类型对待匹配数据进行划分,即,如果用于进行匹配的正则表达式列表为段模式,则按预定分隔符对待匹配数据进行分割(分隔符之间的部分或字符串开始/结束与分隔符之间的部分划分为一个子字符串)如果用于进行匹配的正则表达式列表为行模式,则按换行符对待匹配数据进行分割(换行符之间或字符串开始/结束与换行符之间的部分划分为一个子字符串)。 分割后,按子字符串正则表达式逐一地对分隔得到的待匹配子字符串进行匹配。图2是进一步说明所述步骤100的具体流程的方法流程图。如图2所示,所述步骤100包括步骤101、解析所述匹配字符串;步骤102、判断所述匹配字符串的格式是否以预定的段模式分隔符为界进行重复, 如果是,所述匹配字符串匹配类型为段模式,执行步骤103,如果否,所述匹配字符串匹配类型为行模式,执行步骤104;步骤103、设置所述匹配字符串的匹配类型标识为段模式,结束;步骤104、设置所述匹配字符串的匹配类型标识为行模式,结束。图3是进一步说明所述步骤200的具体流程的方法流程图。如图3所示,所述步骤200包括步骤201、判断所述匹配字符串的匹配类型标识为段模式还是行模式,如果为段模式,则执行步骤202,如果为行模式则执行步骤203 ;步骤202、按段模式分隔符将所述匹配字符串分割为多个匹配子字符串,即将以段模式分隔符为界重复的部分提取为子字符串,执行步骤204 ;步骤203、按换行符将所述匹配字符串分割为多个子字符串,即将字符串中的每一行提取为子字符串,执行步骤204 ;步骤204、取出一个匹配子字符串,根据预定的词组标记提取其中的由词组标记标识的词组和词组间字符;步骤205、根据词组间字符判断所述匹配子字符串的正则表达式生成模式为列模式还是非列模式,如果是列模式,则执行步骤206,如果是非列模式,则执行步骤207 ;步骤206、将在步骤204中提取的词组用表示至少一个空白字符的正则表达式 “\s*”连接为子字符串正则表达式,执行步骤208 ;步骤207、将在步骤204中提取的词组用表示至少一个非换行符的任意字符的正则表达式* ”连接为子字符串正则表达式,执行步骤208 ;步骤208、将得到的子字符串正则表达式加入正则表达式列表;步骤209、判断是否还有未处理的匹配子字符串,如果有,则执行步骤204,如果没有,则执行步骤210 ;步骤210、结束正则表达式生成。图4是进一步说明所述步骤300基于正则表达式进行字符串匹配的具体流程的方法流程图。如图4所示,所述步骤300包括步骤301、判断所述正则表达式列表的匹配类型标识为段模式还是行模式,如果为段模式,则执行步骤302,如果为行模式则执行步骤303 ;
式; 骤308
步骤302、将待匹配数据按段分割为待匹配子字符串,执行步骤304 ;
步骤303、将待匹配数据按行分割为待匹配子字符串,执行步骤304 ;
步骤304、按顺序从所述正则表达式列表中读取一个未处理的子字符串正则表达
步骤305、用子字符串正则表达式与待匹配子字符串进行匹配;
步骤306、判断子字符串匹配是否成功,如果失败执行步骤307,如果成功执行步
步骤307、输出字符串匹配失败,结束匹配流程;
步骤308、判断是否还有未处理的子字符串正则表达式,如果有,则执行步骤304, 如果没有,则执行步骤309 ;步骤309、输出字符串匹配成功,结束匹配流程。本发明通过不同匹配模式来覆盖所有的字符串匹配形式,通过设置正则表达式生成模式从而简化了字符串匹配结构体的设计过程。使匹配高效,设计简单,维护方便。在本发明的另一个优选实施例中,可以对行模式进行进一步细分,将行模式分为单行模式和多行模式单行模式的匹配字符串在匹配字符串内没有换行符,匹配字符串只在同一行中出现,而多行模式的匹配字符串内存在至少一个换行符,匹配字符串在多行中出现。也就是说,将匹配类型分为三种类型,即段模式、单行模式和多行模式。在步骤200中分割所述匹配字符串时,对于单行模式的字符串不必进行分割,而对于多行模式的字符串按行进行分割获得多个匹配子字符串。在步骤300中对待匹配数据进行分割时,如果匹配正则表达式的匹配模式为单行模式,则对于待匹配数据不进行分割,如果匹配模式为多行模式,则将待匹配数据按行进行分割。在本发明的又一个优选实施例中,在步骤305进行匹配时,逐字符进行匹配,直到整个子字符串匹配完成。图5是本发明的另一优选实施例的基于正则表达式的字符串匹配装置,所述装置包括解析模块,用于解析匹配字符串,根据预先设定的段模式分隔符以及字符串格式判断匹配字符串的匹配类型为段模式还是行模式,根据判断得到的匹配类型为匹配字符串设置代表其匹配类型的标识,即匹配类型标识。正则表达式生成模块,用于按匹配类型标识将匹配字符串划分为多个子字符串组成的字符串列表,对每个子字符串确定正则表达式生成模式,并根据正则表达式生成模生成子字符串匹配正则表达式。其中,对于段模式的匹配字符串,将该匹配字符串按分隔符进行分割,对于行模式的匹配字符串,将该匹配字符串按换行符进行分割。分割后,对于每一个子字符串,按预先设定的词组标记解析该子字符串,获得子字符串中的词组以及词组之间的字符,根据所述词组之间的字符判断该子字符串的正则表达式生成类型是列模式还是非列模式,对于列模式的子字符串,在提取得到的词组之间用“\s*”元符号连接形成子字符串正则表达式,对于非列模式的子字符串,在提取得到的词组之间用“.* ”元符号连接形成子字符串正则表达式,最后将各子字符串正则表达式合并为子字符串正则表达式列表, 并将所属匹配类型标识设置到所述正则表达式列表。数据匹配模块,用于进行数据匹配,获取正则表达式列表的匹配类型标识,根据匹配类型对待匹配数据进行划分,即,如果用于进行匹配的正则表达式列表为段模式,则按预定分隔符对待匹配数据进行分割(分隔符之间的部分或字符串开始/结束与分隔符之间的部分划分为一个子字符串)如果用于进行匹配的正则表达式列表为行模式,则按换行符对待匹配数据进行分割(换行符之间或字符串开始/结束与换行符之间的部分划分为一个子字符串)。分割后,按子字符串正则表达式逐一地对分割得到的待匹配子字符串进行匹配。上述仅为本发明的较佳实施例及所运用技术原理,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围内。
权利要求
1.一种基于正则表达式的字符串匹配方法,包括步骤100、解析匹配字符串,根据预先设定的段模式分隔符以及字符串格式判断匹配字符串的匹配类型为段模式还是行模式,根据判断得到的匹配类型设置匹配类型标识;步骤200、根据匹配类型标识将匹配字符串按段分割或按行分割为多个子字符串,对每个子字符串确定正则表达式生成模式,并根据正则表达式生成模式以不同的连接式连接所述子字符串中以预定词组标记标识的词组生成子字符串正则表达式,获得包含至少一个子字符串正则表达式的正则表达式列表;步骤300、根据匹配类型标识对待匹配数据进行按段分割或按行分割获得待匹配子字符串,按子字符串正则表达式逐一地对分割得到的待匹配子字符串进行匹配,输出匹配结果。
2.如权利要求I所述的基于正则表达式的字符串匹配方法,其特征在于匹配类型为段模式是指所述匹配字符串的格式以所述预定的段模式分隔符为界进行重复,匹配类型为行模式是指所述匹配字符串格式为不符合段模式的其它模式。
3.如权利要求I所述的基于正则表达式的字符串匹配方法,其特征在于所述按段分割是以预定段模式分隔符为界截取子字符串,所述按行分割是以换行符为界截取子字符串。
4.如权利要求I所述的基于正则表达式的字符串匹配方法,其特征在于所述正则表达式生成模式包括列模式和非列模式,对于列模式,利用代表至少一个空白字符的连接正则表达式连接词组生成子字符串正则表达式,对于非列模式,利用代表至少一个非换行符的任意字符的连接则正表达式生成子字符串正则表达式。
5.如权利要求I所述的基于正则表达式的字符串匹配方法,其特征在于,所述步骤100 包括步骤101、解析所述匹配字符串;步骤102、判断所述匹配字符串的格式是否以预定的段模式分隔符为界进行重复,如果是,所述匹配字符串匹配类型为段模式,执行步骤103,如果否,所述匹配字符串匹配类型为行模式,执行步骤104;步骤103、设置所述匹配字符串的匹配类型标识为段模式,结束步骤100流程;步骤104、设置所述匹配字符串的匹配类型标识为行模式,结束100流程。
6.如权利要求I所述的基于正则表达式的字符串匹配方法,其特征在于,所述步骤200 包括步骤201、判断所述匹配字符串的匹配类型标识为段模式还是行模式,如果为段模式, 则执行步骤202,如果为行模式则执行步骤203 ;步骤202、按段模式分隔符将所述匹配字符串分割为多个匹配子字符串,执行步骤204 ;步骤203、按换行符将所述匹配字符串分割为多个子字符串,执行步骤204 ;步骤204、取出一个未处理的匹配子字符串,根据预定的词组标记提取其中的由词组标记标识的词组和词组间字符;步骤205、根据词组间字符判断所述匹配子字符串的正则表达式生成模式为列模式还是非列模式,如果是列模式,则执行步骤206,如果是非列模式,则执行步骤207 ;步骤206、将在步骤204中提取的词组用表示至少一个空白字符的连接正则表达式连接为子字符串正则表达式,执行步骤208 ;步骤207、将在步骤204中提取的词组用表示至少一个非换行符的任意字符的连接正则表达式连接为子字符串正则表达式,执行步骤208 ;步骤208、将得到的子字符串正则表达式加入正则表达式列表;步骤209、判断是否还有未处理的匹配子字符串,如果有,则执行步骤204,如果没有, 则执行步骤210 ;步骤210、结束正则表达式生成。
7.如权利要求I所述的基于正则表达式的字符串匹配方法,其特征在于,所述步骤300 包括步骤301、判断所述匹配类型标识为段模式还是行模式,如果为段模式,则执行步骤 302,如果为行模式则执行步骤303 ;步骤302、将待匹配数据按段分割为待匹配子字符串,执行步骤304 ;步骤303、将待匹配数据按行分割为待匹配子字符串,执行步骤304 ;步骤304、按顺序从所述正则表达式列表中读取一个未处理的子字符串正则表达式; 步骤305、用子字符串正则表达式与待匹配子字符串进行匹配;步骤306、判断子字符串匹配是否成功,如果失败执行步骤307,如果成功执行步骤308 ;步骤307、输出字符串匹配失败,结束匹配流程;步骤308、判断是否还有未处理的子字符串正则表达式,如果有,则执行步骤304,如果没有,则执行步骤309 ;步骤309、输出字符串匹配成功,结束匹配流程。
8.一种基于正则表达式的字符串匹配装置,包括解析模块,用于解析匹配字符串,根据预先设定的段模式分隔符以及字符串格式判断匹配字符串的匹配类型为段模式还是行模式,根据判断得到的匹配类型设置匹配类型标正则表达式生成模块,用于根据匹配类型标识将匹配字符串按段分割或按行分割为多个子字符串,对每个子字符串确定正则表达式生成模式,并根据正则表达式生成模式以不同的连接式连接所述子字符串中以预定词组标记标识的词组生成子字符串正则表达式,获得包含至少一个子字符串正则表达式的正则表达式列表;数据匹配模块,用于根据匹配类型标识对待匹配数据进行按段分割或按行分割获得待匹配子字符串,按子字符串正则表达式逐一地对分割得到的待匹配子字符串进行匹配,输出匹配结果。
全文摘要
本发明公开了一种基于正则表达式的字符串匹配方法,包括步骤100、根据字符串格式判断匹配字符串的匹配类型为段模式还是行模式,设置匹配类型标识;步骤200、根据匹配类型标识将匹配字符串按段分割或按行分割为多个子字符串,对每个子字符串确定正则表达式生成模式,并根据正则表达式生成模式以不同的连接正则表达式连接词组生成子字符串正则表达式,获得包含至少一个子字符串正则表达式的正则表达式列表;步骤300、根据匹配类型标识对待匹配数据进行按段分割或按行分割获得待匹配子字符串,按子字符串正则表达式逐一地对分割得到的待匹配子字符串进行匹配,输出匹配结果。
文档编号G06F17/30GK102609459SQ20121000927
公开日2012年7月25日 申请日期2012年1月12日 优先权日2012年1月12日
发明者刘磊 申请人:神州数码网络(北京)有限公司