我想知道正则表达式是如何工作的,我的特殊正则表达式有一个看起来像这样的元素:
(word1|word2|wordn......)
字数大数百 我想知道正则表达式引擎是否只是逐个测试单词,或者它是否优化搜索以及它的方式 任何指向良好文档的指针都会很好。
答案 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并检查包含。