有没有办法优化通用正则表达式?

时间:2013-08-03 21:22:21

标签: regex algorithm search

我在Eclipse中编写代码,当我执行CTRL-F查找字符串时,我发现除了整个单词的标准化选项(区分大小写)之外,还有一个正则表达式搜索选项(它是那里也有Notepad ++)。

我已经尝试过一次或两次,通常结果几乎是瞬间完成的。但毕竟代码文件不是很大,最大的代码文件不超过500行,大多数行填充不到一半。是否有任何方法可以优化,以便任何用户提供的正则表达式在大块文本上运行得更快,比如10-15 MB的大小?

我无法想到任何方法,因为没有像Rabin-Karp这样的标准化搜索算法或后缀树在这里适用!

2 个答案:

答案 0 :(得分:1)

我不知道如何在Eclipse中实现正则表达式以及为什么它如此慢。这里只是一些想法:

首先,您应该了解一些概念:Nondeterministic finite automaton (NFA)Deterministic finite automaton (DFA)。理论上,正则表达式,NFA和DFA是等价的,这意味着它们具有完全相同的描述语言(字符序列)的能力。这意味着它们中的任何一个都可以转换为另一个(参见this site)。

正则表达式可以通过将其转换为DFA来实现,并且使用DFA匹配文本只需要线性时间(许多字符串匹配算法,例如KMP,实际上是特殊的DFA)。但问题是,大多数现代正则表达式实现都引入了反向引用等功能,因此无法使用DFA。

因此,如果丢弃这些复杂的特征是可能的,那么实现快速正则表达式是可行的(在线性时间内进行匹配)。您可以在this article找到更多信息。

答案 1 :(得分:0)

是什么让你认为后缀树不适合这个问题?来自http://en.wikipedia.org/wiki/Suffix_tree

构建[后缀树]后,可以快速执行多个操作,例如在S中定位子字符串,如果允许一定数量的错误则定位子字符串,定位常规匹配表达模式

我认为修改过的Boyer-Moore字符串搜索算法也是可能的。