例如,我有这样的情况:
在服务器上,我们有一个单词列表:
{'word1', 'word2', 'word3', 'word4'}用户向服务器发送包含以下文本的请求:
"some text here word1. many many other text word4"服务器必须处理此输入文本,从服务器列表中找到此文本中的所有单词,并标记此单词,然后将结果文本发送给用户:
"some text here <mark>word1<mark>. many many other text <mark>word4<mark>"它是主要的思想,主要的概念。此时此刻,我必须实现这个逻辑。
所以,我请求你的帮助。
对我来说,定义技术和工具是必要的。
你可以推荐什么工具来完成这项任务?
发布于 2011-11-01 20:42:48
以下是一个简单的解决方案:
for (String word : words) {
text = text.replaceAll(word, "<mark>" +word + "</mark>");
}更好的解决方案应该使用正则表达式,以避免替换单词片段,例如wo<mark>man</mark>。您应该像"\\b" + word + "\\b"一样创建正则表达式。
但我建议你看看像Solr (或Lucine)这样的可供使用的引擎。
发布于 2011-11-01 20:43:45
有许多悬而未决的问题,比如到底是什么界定了“单词”。例如,您希望在“全文”中突出显示"full“吗?
顺便说一下: Lucene、Solr等在这里不会有太多帮助。当然,您可以使用它们,但这是没有意义的。他们的长处在于建立了一个text的索引。文本可能意味着大量的数据。一组单词受该语言的字典的限制。对于计算机来说,这通常是一个关于大小的笑话。一个简单的HashSet应该可以满足您的需求。
发布于 2011-11-01 20:53:39
实现这一点的最简单方法是使用String.replaceAll。您可以将所有关键字组合到一个正则表达式中,并使用反向引用来包含原始单词。如果关键字包含正则表达式运算符,则必须对其进行转义。
在循环中调用String.replaceAll通常是错误的,因为中间结果可能包含不在输入中的匹配。作为一个人为的例子,假设我想用"b“替换"ab”,用"c“替换"bb”。因此,"bab“的正确输出应该是"bb”。然而,"bab".replaceAll("ab","b").replaceAll("bb","c")是"c“。出于同样的原因,您不希望在循环中使用String.replace,尽管这似乎是完成手头任务的最简单方法。
如果您需要比这更高的性能,第一步将是提前编译正则表达式。如果你需要更多,这里有一些非常有趣的关于字符串搜索的研究论文。
https://stackoverflow.com/questions/7966553
复制相似问题