Java中的正则表达式字典搜索

Java中的正则表达式字典搜索,java,dictionary,data-structures,trie,Java,Dictionary,Data Structures,Trie,我有一本大字典(大约1000万个单词和短语)。我想建立一个非常快速的系统,允许使用*和?面具。例如: *东部标准时间*: 对于est estimate nest k??g*: king kaggle kingdom 我知道,如果我手动编程,使用trie数据结构可以很容易地解决这个问题。Java中是否已经为这样的任务准备好了(或几乎准备好了)?一种方法是创建一个包含1000万个单词和短语的字符串。构建字符串,使每行有一个条目。也就是说,如果“foo”、“bar”和“bas”都是单词,那么字符串将是

我有一本大字典(大约1000万个单词和短语)。我想建立一个非常快速的系统,允许使用*和?面具。例如:

*东部标准时间*:

对于est

estimate

nest

k??g*:

king

kaggle

kingdom


我知道,如果我手动编程,使用trie数据结构可以很容易地解决这个问题。Java中是否已经为这样的任务准备好了(或几乎准备好了)?

一种方法是创建一个包含1000万个单词和短语的字符串。构建字符串,使每行有一个条目。也就是说,如果“foo”、“bar”和“bas”都是单词,那么字符串将是:

"foo\nbar\nbas\n"
然后可以使用标准正则表达式库查找所有匹配项。只要确保您的正则表达式被锚定,这样它就不会超出换行符。因此,如果您查找正则表达式“ba*”,它将找到“bar”和“bas”,而不是“bar\nbas\n”

我认为Java正则表达式的默认设置是在换行符处停止,因此您可能不需要做任何特殊的事情。否则,可以使用正则表达式选项指定如何处理字符串中嵌入的换行符

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

显然,您希望在启动时或字典更改时只构建一次这个巨大的字典字符串。不管怎样,你真的不想为每一次搜索构建它


这并不是最快的解决方案,但对于您的目的来说,它可能已经足够快了。它很容易实现,也很容易证明是正确的。这是一个很好的开始方式。

如果是在数据库中,您可以将这些查询转换为
如“%est%”
如“k??g%”
。如果数据库中没有这些数据,可以查看内存中的数据库。或者,您可以看看在lucene之上构建的各种搜索引擎(或直接使用lucene)。您可能想看看Apache lucene及其模糊搜索功能。不使用trie数据结构,但Apache lucene是一个非常强大的索引和搜索框架,您想问我们准备好的代码吗?这与堆栈溢出无关。我们在这里回答有关编程问题的问题,而不是有关现有工具和库的问题。我不这么认为。你想要达到的目标并不是一件小事。由于您正在寻找一些可用于生产的库,Lucene可能是您的最佳选择。