Ruby正则表达式太大/多字符串匹配

时间:2012-09-24 23:59:44

标签: ruby regex

我有1,000,000个字符串,我想分类。我这样做的方法是,如果它包含一组单词或短语,请将其存储起来。这组词大约是10,000。理想情况下,我可以支持正则表达式,但我现在专注于让它快速运行。示例短语:

福特,保时捷,马自达...

我真的不想将每个单词与字符串逐个匹配,所以我决定使用正则表达式。不幸的是,我遇到了正则表达式问题:

  
    

Regexp.new( “(一)” * 253)     => /(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)( A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(a)中(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A )(A)(A)(A)(A)...

         

Regexp.new( “(一)” * 254)     RegexpError:正则表达式太大:/(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a) (A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)(A )(A)(A)(A)(A)(A)(A)(A)(A)(A)(A)...

  

其中a将是我的一个单词或短语。现在,我计划运行10,000/253场比赛。我读到正则表达式的长度会严重影响性能,但我的正则表达式匹配非常简单,并且正则表达式非常快。我想以某种方式绕过限制,或者如果有人有任何想法,可以使用更好的解决方案。感谢。

1 个答案:

答案 0 :(得分:1)

您可能会考虑其他识别10k字的机制。

  • Trie:有时称为前缀树,拼写检查器经常使用它进行单词查找。请参阅Trie on wikipedia
  • DFA(确定性有限自动机):DFA通常由编译器中的词法分析器创建,用于识别语言的标记。 DFA运行得非常快。简单的正则表达式通常编译为DFA。请参阅DFA on wikipedia