【发布时间】:2012-12-20 21:43:18
【问题描述】:
我正在尝试有效地提取静态字符串(必须匹配给定正则表达式以匹配的字符串)。我已经能够在最简单的情况下做到这一点,但我正在努力寻找更强大的解决方案。
给定一个正则表达式,如下所示
"fox jump(ed|ing|s)"
会给我们
"fox,jumped,jumping,jumps"
另一个例子是
"fox jump(ed|ing|s)?"
这会给我们带来什么
"fox,jump"
因为可选操作符
目前我的算法过于简单。它将从正则表达式的末尾开始并删除组或单个字符,后跟这些运算符“*?”以及“explode”分组的 OR 运算符“(|)”。这工作得很好,但没有考虑到正则表达式的完整语法。您可以将其视为正则表达式的最小集合生成过程(正则表达式可以“生成/必须匹配”的最小字符串集)。
为什么? 我正在尝试将一堆文本与大量正则表达式进行匹配。如果我可以获得这些“必需”的正则表达式的“关键字”列表,我可以对该关键字进行快速文本搜索以过滤我关心的正则表达式(忽略那些我保证不匹配甚至跳过该文本完全有效地不在文本上运行任何正则表达式,因为我们保证在我们的正则表达式集中没有匹配项)。我可以在一个有效的数据结构(Binary Search/Trie/Aho-Corasick)中组织这组关键字,以在我尝试通过有限自动机运行文本之前过滤这组正则表达式。在我尝试运行正则表达式之前,我可以运行非常快速的字符串匹配算法作为过滤阶段。通过这个简单的过程,我已经能够将吞吐量提高很多倍。
【问题讨论】:
-
为什么要这样做?一些背景可能会带来一些更好的方法来实现你想要做的事情。
-
在为什么?部分。谢谢!
-
+1 听起来是经过深思熟虑的
-
首先,您需要解析正则表达式(完整的语法 - 以便您可以识别您不想实现的正则表达式的特征),然后从解析树编写生成器。您可能希望为那些可以匹配无限集或大型输入集的对象设置上限,例如
.、否定字符类、*、+、{n,}。我主要是在这里说话,所以我不知道这是否真的可行,但值得一试。
标签: regex