【问题标题】:Regex search by dictionary in Java在Java中按字典进行正则表达式搜索
【发布时间】:2017-03-28 09:39:05
【问题描述】:

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

*est*:

对于est

估计估计

nest

k??g*

kg

kaggle

kingdom

我知道如果我手动编程,使用 trie 数据结构可以很容易地解决它。 Java 中的此类任务是否已准备好(或几乎准备好)?

【问题讨论】:

  • 如果在数据库中,您可以将这些查询转换为 like '%est%'like 'k??g%' 。如果您在数据库中没有该数据,您可以查看内存数据库。或者,您可以查看基于 lucene 构建的各种搜索引擎(或直接使用 lucene)。
  • 您可能想看看 Apache Lucene 及其模糊搜索功能。
  • 没有使用 trie 数据结构,但是 Apache Lucene 是一个非常强大的索引和搜索框架
  • 那么,您是在要求我们提供现成的代码吗?这与堆栈溢出无关。我们在这里回答有关编程问题的问题,而不是有关现有工具和库的问题。请参阅help center
  • @DenisKulagin 我不这么认为。您要实现的目标并不是一项微不足道的任务。由于您正在寻找一些可用于生产的库,因此 Lucene 可能是您的最佳选择。

标签: java dictionary data-structures trie


【解决方案1】:

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

"foo\nbar\nbas\n"

然后您可以使用标准正则表达式库来查找所有匹配项。只需确保您的正则表达式已锚定,使其不会超出换行符。所以如果你寻找正则表达式"ba*",它会找到“bar”和“bas”,而不是找到“bar\nbas\n”。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多