Java正则表达式是否优化了这种特定情况?

时间:2011-02-08 07:33:03

标签: java regex

我想知道正则表达式是如何工作的,我的特殊正则表达式有一个看起来像这样的元素:

(word1|word2|wordn......)

字数大数百 我想知道正则表达式引擎是否只是逐个测试单词,或者它是否优化搜索以及它的方式 任何指向良好文档的指针都会很好。

3 个答案:

答案 0 :(得分:1)

请参阅this link
这篇Javaworld文章解释了java regexp的基本机制(称为NFA用于非确定性有限自动机,或NFA)。关于这个主题还有完整的书籍。另请查看Resources Section

答案 1 :(得分:1)

如果你有几百个单词,你需要注意正则表达式中单词的排序。正则表达式引擎从左到右查找字样 如果您针对替换setValue测试单词set|setValue,则它将仅匹配包含“set”的3个字母,而不是整个字符串。

有关完整说明,请参阅此link(来自www.regular-expressions.info)。

我认为正则表达式引擎不会真正优化轮换(即分析公共前缀并相应地构建nfa)。因此,有这么多的话,我认为这不会是一种优化。

除了重新排序单词之外,您还可以尝试在交替后添加单词或行边界,例如(set|setValue)$,但我怀疑正则表达式引擎会进行大量的回溯,因此可能不值得努力。

答案 2 :(得分:1)

如果您认为RE引擎是此类搜索的瓶颈,您可以轻松构建trie并检查包含。