具体实施方式
本发明涉及用于分解和合并正则表达式的方法、系统和计算机程序产品。访问一个或多个关键字图。该一个或多个关键字图从第一正则表达式分解。该一个或多个关键字图的每一个具有根节点、一个或多个中间节点、以及叶节点。该一个或多个中间节点以及叶节点的每一个标识与第一正则表达式部分地相匹配的字符模式。该一个或多个中间节点的每一个和根节点具有单个子节点。中间节点之一具有叶节点作为子节点。每个叶节点被标记为第一正则表达式的匹配状态。
访问第二图。第二图表示第二正则表达式。该第二图具有根节点、一个或多个中间节点、以及一个或多个叶节点。该一个或多个中间节点以及一个或多个叶节点的每一个标识与第二正则表达式部分地相匹配的字符模式。该第二图具有标记为第二正则表达式的匹配状态的一个或多个端节点。
该一个或多个关键字图和第二图被合并成有向非循环图,该有向非循环图共同表示第一正则表达式和第二正则表达式二者。合并包括在一个或多个关键字图和第二图内标识具有至少部分重叠的字符模式的任何相似定位的中间节点。对于任何所标识的具有部分重叠的字符模式的中间节点,所标识的中间节点的至少之一的字符模式被更改以消除部分重叠的字符模式。边被添加在关键字图和第二图之间以对更改所标识中间节点的至少之一的字符模式作出补偿。对于任何所标识的具有完全重叠的字符模式的中间节点,关键字图中的中间节点和第二图中的中间节点被组合成表示完全重叠的字符模式的单个节点。
本发明的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和系统存储器的计算机硬件,如以下更详细讨论的。本发明范围内的各实施例还包括用于携带或存储计算机可执行指令和/或数据结构的物理介质及其他计算机可读介质。这些计算机可读介质可以是通用或专用计算机系统可访问的任何可用介质。存储计算机可执行指令的计算机可读介质是计算机存储介质(设备)。携带计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种完全不同类型的计算机可读介质:计算机存储介质(设备)和传输介质。
计算机存储介质(设备)包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置的且可由通用或专用计算机访问的任何其他介质。
“网络”被定义为允许在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线、无线、或者硬连线或无线的组合)传送到或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且通用或专用计算机可访问的网络和/或数据链路。上述的组合也应当被包括在计算机可读介质的范围内。
此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动传输到计算机存储介质(设备)(或反之亦然)。例如,通过网络或数据链接接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”)内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质(设备)。因而,应当理解,计算机存储介质(设备)可被包括在还利用(甚至主要利用)传输介质的计算机系统组件中。
计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。虽然用结构特征和/或方法动作专用的语言描述了本主题,但是应当理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,所述特征和动作是作为实现权利要求的示例形式而公开的。
本领域的技术人员将理解,本发明可在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可位于本地和远程存储器存储设备两者中。
在本说明书和所附权利要求中,“正则表达式”是用来匹配文本串,诸如举例而言特定字符、词或字符模式的结构。在一些实施例中,正则表达式具有有限字母表。正则表达式可用能通过正则表达式处理器解释的形式语言来编写。正则表达式处理器用作解析器发生器,或检查文本并标识与所提供正则表达式相匹配的文本部分。
一般而言,图可用来表示正则表达式及其匹配状态。例如,暂时参看图2,图201表示正则表达式“(\d\d)|(a(b|c))”。类似地,暂时参看图4,图401表示正则表达式“([a,b,c]x)|(\d(cd|[1,3,5]([a,c,d]|ea)))”。图可通过用输入文本执行状态机来“运行”,这允许多个图的并行化。
图1示出便于分解和合并正则表达式的示例计算机体系结构100。参考图1,计算机体系结构100包括分解模块101、标记模块102、以及合并模块141。所描绘的组件中的每一个可通过诸如举例而言局域网(“LAN”)、广域网(“WAN”)和甚至因特网等网络(或作为网络的一部分)彼此连接。因此,所描绘的组件中的每一个以及任何其他连接的计算机系统及其组件都可创建消息相关数据并通过网络交换与消息相关数据(例如,网际协议(“IP”)数据报和利用IP数据报的其他更高层协议,诸如传输控制协议(“TCP”)、超文本传输协议(“HTTP”)、简单邮件传输协议(“SMTP”)等)。
一般而言,分解可用来从表示正则表达式的更复杂的图产生表示正则表达式的一组简单图。因此,分解模块101被配置成将诸如举例而言表示正则表达式的图的图分解成对应的多个关键字图。分解模块101实质上能去除更复杂的正则表达式的转折部分,以将该更复杂的正则表达式分成多个更简单的正则表达式。每个关键字图的叶节点表示来自更复杂图的端条件(在更复杂图中其可以在中间节点或叶节点处)。分解模块101可分解标记或非标记图。
标记模块102被配置为标记图或关键字图的节点以指示所表示正则表达式的匹配状态。标记模块102可在分解之前或之后标记节点。
再次参看图2,图2示出分解表示正则表达式的图的示例。如图所示,分解模块101接收图201作为输入。图201先前被标记(由对角阴影线表示)以指示正则表达式“(\d\d)|(a(b|c))”的匹配状态。分解模块101分解图201并输出关键字图202。图201中的标记被携带至关键字图202。由此,当文本与图201或任一个关键字图202作比较(碰上)时,任一匹配被指示为与“(\d\d)|(a(b|c))”的匹配。
再次参看图4,图4示出分解表示正则表达式的图的另一示例。如图所示,分解模块101接收图401作为输入。图401先前被标记(由对角阴影线表示)以指示正则表达式“([a,b,c]x)|(\d(cd|[1,3,5]([a,c,d]|ea)))”的匹配状态。分解模块101分解图401并输出关键字图402。图401中的标记被携带至关键字图402。由此,当文本与图401或任一个关键字图402作比较(碰上)时,任一匹配被指示为与“([a,b,c]x)|(\d(cd|[1,3,5]([a,c,d]|ea)))”的匹配。
在一些实施例中,根据以下算法将图分解成关键字图:
在根节点处开始。
标识该根节点的所有子节点。
对于这些节点的每一个:
a.复制该节点之上的父节点(称此为“prefix.i”(前缀.i))。
b.添加此节点及其子树作为“prefix.i”的子。
c.再次从(2)开始,但是使用当前节点作为根节点。
该算法能产生表示该图的关键字图(例如DAG)集合。每个关键字图具有作为叶节点的单个端节点。在每个图内,每个节点具有单个子节点。
一般而言,可使用合并来产生表示正则表达式的集合的单个有向非循环图(“DAG”)。相应地,合并模块101被配置成接收两个图作为输入,并将这两个图合并成共同表示两个输入图的匹配状态的单个DAG。为了消除处理冗余,合并模块101可将两个输入图中相似定位节点处的重叠字符模式组合成单个DAG中的单个节点。当字符模式部分重叠时,合并模块101可更改一个输入图中一节点处的字符模式。合并模块101然后可通过在该节点与另一输入图中对应节点之间添加附加边来进行补偿。添加附加边便于两个输入图与单个DAG之间匹配状态的等价。
在一些实施例中,合并模块141将两个关键字图合并成单个DAG。在其它实施例中,合并模块141将关键字图和另一图合并成单个DAG。合并模块141的功能可按需重新使用以将更大集合的图合并在一起。
参看图3,合并模块141将关键字图301(例如先前从另一图分解的)和图302合并成有向非循环图304。合并模块141将图302和关键字图301A用作输入。合并模块141将图302和关键字图301A合并成中间图303。随后,合并模块141利用中间图330和关键字图301B。合并模块141将中间图303和关键字图301B合并成有向非循环图304。因为字符模式节点312和313重叠,所以节点312和313合并成有向非循环图304中的单个节点314。
标记(如不同对角阴影线所指示)在整个合并过程中维持。因而,端节点指示相匹配的正则表达式。节点316和317指示与正则表达式“\d\d|um”(它们从中分解的正则表达式)的匹配,而节点318指示与正则表达式“un”的匹配。
如图3所示,合并模块141的输入是外部的。在其它实施例中,合并模块141接收一组图作为输入并输出DAG。在处理期间,中间图在合并模块141内保持并进行内部处理。
如图所示,合并模块141包括位置检测器142、重叠检测器143以及重叠补偿器144。在合并位置期间,位置检测器142被配置成标识不同图内的相似定位节点。相似定位节点可基于离根节点的距离来标识。例如,在图3中,节点312和313被相似地定位。在合并期间,重叠检测器143被配置成检测不同节点的字符模式是否至少部分地重叠。例如,字符模式[1,3,5]部分地匹配字符模式\d。另一方面,字符模式[a,b,c]和字符模式[a,b,c]完全重叠。在合并期间,重叠补偿器144被配置成在具有部分重叠字符模式的节点被合并成单个节点时进行补偿。补偿可包括在正在被合并的输入图之间添加边。附加边便于输入图的匹配状态与所得DAG的匹配状态之间的等价。
图5示出合并表示不同正则表达式的图的另一示例。关键字图501和图502可作为输入来接收(例如在合并模块141处)。位置检测器142能检测节点511和节点512分别在关键字图501和图502中相似地定位。重叠检测器143能标识部分重叠的模式503(或公共边)。即,字符模式\d与字符模式[2,3]部分地重叠。重叠补偿器144可通过将节点511的字符模式更改为“\d-[2,3]”来去除部分重叠(去除公共边)。重叠补偿器还可添加从节点512至节点513的边514。合并模块114然后能组合根节点以将(经更改的)关键字图501添加至图502。重叠补偿允许图进行合并,但仍表示等效的匹配状态。例如,即使在节点512处作比较(且绕过节点511),文本串“2cd”也仍然匹配关键字图501。
如图所示,端节点内的不同阴影线分别指示关键字图501和图502的匹配状态。
在一些实施例中,图根据以下算法来合并:
仅用根节点创建空DAG。将此标记为Final.DAG(最后.DAG)。
对于集合中的每个DAG(i.DAG),进行以下操作:
a.将i.node(i.节点)设置为i.DAG的根节点。
b.将final.node(最后.节点)设置为Final.DAG(最后.DAG)的根节点。
c.只要final.node具有完全相同的边,就遍历i.node和final.node迭代。
d.如果i.node边是final.node边的超集,则:
i.在i.node与final.node之间添加表示非公共字符的边。此边指向i.node的子。
ii.对于每个公共(边,节点)
1.只要final.node和i.node具有完全相同的边,就沿final.node和i.node迭代。
2.如果到达端节点,则将其标记为i.DAG的端节点。
3.如果未到达,则添加从final.node到i.node的子的边。
e.如果final.node边是i.node边的超集,则:
i.在i.node与final.node之间添加表示非公共字符的边。此边指向final.node的子。
ii对于每个公共(边,节点)
1.只要final.node和i.node具有完全相同的边,就沿final.node和i.node迭代。
2.如果到达端节点,则将其标记为final.DAG的端节点。
3.如果未到达,则添加从i.node到final.node的子的边。
图6示出用于分解和合并正则表达式的示例方法600的流程图。方法600将相关于计算机体系结构100的组件和数据并部分参考图3和5来描述。
方法600包括访问表示第一正则表达式的图的动作(动作601)。例如,分解模块101可访问表示正则表达式111的图112。方法600包括将图分解成一个或多个关键字图的动作(动作602),一个或多个关键字图的每一个具有根节点、一个或多个中间节点、以及叶节点,一个或多个中间节点以及叶节点的每一个标识部分地匹配第一正则表达式的字符模式,一个或多个中间节点的每一个以及根节点具有单个子节点,中间节点之一具有叶节点作为子节点。例如,分解模块101可将图112分解成关键字图113(例如113A、113B、113C等)。
方法600包括将一个或多个关键字图的每一个的叶节点标记为第一正则表达式的匹配状态的动作(动作603)。例如,标记模块102可标记关键字图113的叶节点以产生标记关键字图113AL、113BL、113BL等。
方法600包括访问表示第二正则表达式的第二图的动作(动作604),该第二图具有根节点、一个或多个中间节点、以及一个或多个叶节点,一个或多个中间节点以及一个或多个叶节点的每一个标识部分地匹配第二正则表达式的字符模式。例如,标记模块102可访问表示正则表达式121的图123。方法600包括将第二图中的一个或多个端节点标记为第二正则表达式的匹配状态的动作(动作605)。例如,标记模块102可标记图123的端节点以生成标记图123L。
方法600包括将一个或多个关键字图和第二图合并成有向非循环图的动作(动作606),该有向非循环图共同表示第一正则表达式和第二正则表达式两者。例如,合并模块141可将标记关键字图113L和标记图123L合并成有向非循环图134。有向非循环图134共同表示正则表达式111和正则表达式121。
动作606包括在一个或多个关键字图和第二图内标识具有至少部分重叠的字符模式的任何相似定位的中间节点的动作(动作607)。例如,位置检测器142可标识一个或多个标记关键字图113L和标记图123L中的相似定位中间节点。相似定位节点可以是与其根节点等距的节点。例如,参照图3,节点312和313是相似定位的(两者均距其相应根节点一条边)。类似地,在图5中,节点511和512被相似地定位。在图5中,节点513和514也被相似定位。
在相似定位的中间节点中,重叠检测器143可检测何时节点具有至少部分重叠的字符模式。在图3中,节点312和313完全重叠。在图5中,节点511和512部分重叠,而节点513和514不重叠。
对于相似定位且具有部分重叠字符模式的关键字图中的任何所标识中间节点和第二图中的所标识中间节点,动作606包括更改所标识中间节点的至少之一的字符模式以消除部分重叠的字符模式的动作(动作608)。例如,重叠补偿器144可更改中间节点处的字符模式以消除与另一节点的部分重叠。参照图5,节点511处的字符模式“\d”可被更改成“\d-[2,3]”(其等效于[0,1,4,5,6,7,8,9])以消除与节点512的部分重叠。
对于相似定位且具有部分重叠字符模式的关键字图中的任何所标识中间节点和第二图中的所标识中间节点,动作606包括在关键字图与第二图之间添加边以对更改所标识中间节点的至少之一的字符模式进行补偿的动作(动作609)。例如,重叠补偿器144可添加从非经更改节点到该经更改节点之下的节点的边以对更改经更改节点的字符模式进行补偿。参照图5,可添加从节点512至节点513的边514以对更改节点511的字符模式进行补偿。
对于相似定位且具有完全重叠字符模式的关键字图中的任何所标识中间节点和第二图中的所标识中间节点,动作606包括通过将关键字图中的中间节点与第二图中的中间节点组合成表示完全重叠字符模式的单个节点来将关键字图和第二图组合在一起的动作(动作610)。例如,重叠补偿器144可组合标记关键字图113L的中间节点和标记图123L的中间节点。参照图3,节点312和节点313可被组合成节点314。
在创建DAG之后,DAG可针对文本的一部分在状态机上运行,以确定该文本部分是否与DAG中所表示的任何正则表达式相匹配。
在一些实施例中,合并图与经由正则表达式的其它轮组合以便于扩展正则表达式句法(例如*、+、或数集)。例如,当构建DAG以表示正则表达式时,整个正则表达式不能由DAG表示是可能的。例如,正则表达式可包括诸如?:或内嵌*运算符的字符。
可构建越来越复杂的状态机来处理这些类型的运算符。另一替代是创建包括实际正则表达式和单个DAG的多个“文本处理器”。然后可使用以下算法来合并正则表达式:
将正则表达式分解为可表示为复杂DAG和不可表示为复杂DAG的其组分。
a.考虑:123\d\d\d(5.*3)*\d\d\d\d
b.这可产生以下组分:
i.DAG:123\d\d\d|\d\d\d\d
ii.正则表达式:(5.*3)*
对正则表达式和单个DAG运行所有“文本处理器”。
收集文本中发现这些文本处理器的位置(已分类,如由DAG/Regex确保)。
基于DAG的结果及其正则表达式重新组装原始的正则表达式以确定是否发现它了。
如果来自步骤(3)的结果被储存在堆(例如斐波纳契堆)集合中,则该步骤以O(n)为界。
这样,所产生的DAG可与正则表达式引擎一起使用以产生整个正则表达式字母表的结果。多轮方法还允许执行前瞻或后顾正则表达式,而无需原地的反向跟踪或正向跟踪,这简化了系统的复杂性并有助于性能。
因此,本发明的各个实施例将正则表达式分解成多个简单的关键字图,将那些关键字图以紧凑和有效的方式合并,并产生能执行简化正则表达式字母表的有向非循环图(DAG)。若干这些正则表达式DAG然后能合并在一起以产生表示整个集合的正则表达式的单个DAG。可在多轮方法中组合DAG以及其它文本处理算法和堆集合以扩展正则表达式字母表。
本发明可具体化为其它具体形式而不背离其精神或本质特征。所述实施例在所有方面都应当被认为只是说明性的而非限制性的。因此,本发明的范围由所附权利要求书而非上述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变都被权利要求书的范围所涵盖。