如何在 Java 中的字符串中查找整个单词?

新手上路,请多包涵

我有一个必须解析不同关键字的字符串。例如,我有字符串:

“我会来123woods见你”

我的关键词是

‘123 森林’

‘树木’

每当我有比赛和在哪里比赛时,我都应该报告。还应考虑多次出现。

但是,对于这个,我应该只在 ‘123woods’ 上得到一场比赛,而不是在 ‘woods’ 上。这消除了使用 String.contains() 方法。此外,我应该能够拥有一个关键字列表/组,并同时检查它们的出现。在这个例子中,如果我有 ‘123woods’‘come’ ,我应该得到两次。在大文本上方法执行应该有点快。

我的想法是使用 StringTokenizer 但我不确定它是否会表现良好。有什么建议么?

原文由 Nikola Yovchev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 996
2 个回答

以下示例基于您的评论。它使用关键字列表,将使用单词边界在给定的字符串中搜索。它使用来自 Apache Commons Lang 的 StringUtils 来构建正则表达式并打印匹配的组。

 String text = "I will come and meet you at the woods 123woods and all the woods";

List<String> tokens = new ArrayList<String>();
tokens.add("123woods");
tokens.add("woods");

String patternString = "\\b(" + StringUtils.join(tokens, "|") + ")\\b";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

如果您正在寻找更高的性能,您可以查看 StringSearch :Java 中的高性能模式匹配算法。

原文由 Chris 发布,翻译遵循 CC BY-SA 2.5 许可协议

使用其他人回答的正则表达式+单词边界。

 "I will come and meet you at the 123woods".matches(".*\\b123woods\\b.*");

将是真实的。

 "I will come and meet you at the 123woods".matches(".*\\bwoods\\b.*");

将是错误的。

原文由 morja 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题