在Java中使用字典进行正则表达式搜索

时间:2017-03-28 09:39:06

标签: java dictionary data-structures trie

我有一本大字典(大约1000万字和表达)。我想构建一个非常快速的系统,允许使用*和?搜索整个字典。口罩。 E.g:

  

* EST *

     

有关的 EST

     

EST imate

     

名词 EST

     

ķ??克*

     

ķ的

     

ķ的 AG 克的文件

     

ķ的克的 DOM

我知道如果我手动编程,可以使用 trie 数据结构轻松解决。在Java中是否有生产就绪(或几乎准备好)用于此类任务?

1 个答案:

答案 0 :(得分:0)

一种方法是创建一个包含1000万个单词和短语的单个字符串。构建字符串,以便每行有一个条目。也就是说,如果" foo"," bar"," bas"都是单词,字符串是:

"foo\nbar\nbas\n"

然后,您可以使用标准正则表达式库来查找所有匹配项。只需确保您的正则表达式已锚定,以便它不会延伸到换行符之外。因此,如果您查找正则表达式"ba*",它会找到" bar"并且" bas"而不是找到" bar \ nbas \ n"。

认为 Java正则表达式中的默认值是停在换行符处,因此您可能不需要做任何特殊操作。否则,有正则表达式选项可让您指定如何处理字符串中的嵌入换行符。

有一点需要指出:当正则表达式引擎报告找到匹配时,它会报告起始位置。您需要备份到单词的开头(上一个\n),然后复制到结尾(下一个\n)。

显然,您只想在启动时或每当字典更改时构建一个巨大的字典字符串。无论如何,你真的不想为每一次搜索构建它。

这不是最快的解决方案,但它很可能足够快到达您的目的。它易于实施且易于证明是正确的。这是一个很好的入门方式。