【问题标题】:Java: Finding the number of word matches in a given stringJava:查找给定字符串中单词匹配的数量
【发布时间】:2011-10-28 12:50:50
【问题描述】:

我正在尝试查找给定字符串和关键字组合的 单词匹配 的数量,如下所示:

public int matches(String keyword, String text){
 // ...
}

示例:

鉴于以下调用:

System.out.println(matches("t", "Today is really great, isn't that GREAT?"));
System.out.println(matches("great", "Today is really great, isn't that GREAT?"));

结果应该是:

0
2

到目前为止,我发现了这个:Find a complete word in a string java

这只会返回如果给定的关键字存在而不是多少出现。另外,我不确定它是否忽略了区分大小写(这对我很重要)。

记住子字符串应该被忽略!我只想找到完整的单词


更新

我忘了提到我还希望通过空格分隔的关键字匹配。

例如

matches("today is", "Today is really great, isn't that GREAT?")

应该返回 1

【问题讨论】:

  • 看看java.lang.String 中的indexOf(...) 方法。它可以满足您的一切需求。
  • text.indexOf(keyword) 返回文本中关键字的位置。我需要的是出现次数。
  • 是的,并且通过从先前位置开始获取子字符串中 的索引,您可以非常轻松地计算源字符串中搜索字符串的实例数!
  • 嗯,好主意,但我认为这不是很高效。也许正则表达式会更快?

标签: java string search


【解决方案1】:

使用带有单词边界的正则表达式。这是迄今为止最简单的选择。

  int matches = 0;  
  Matcher matcher = Pattern.compile("\\bgreat\\b", Pattern.CASE_INSENSITIVE).matcher(text);
  while (matcher.find()) matches++;

不过,您的里程可能因某些外语而异。

【讨论】:

  • 这也适用于空格分隔的关键字吗?例如。 Pattern.compile("\\btoday is\\b").matcher(text);
  • @valmar:如果设置为不区分大小写,它也可以匹配Great
  • @valmar,它不像isn't那样工作,当你对t进行匹配时,它会找到最后一个t作为匹配项。
  • @The Elite Gentleman:我想您可以使用不同的正则表达式来忽略这些字符,但是问题就变成了:您将什么定义为单词?您希望它在isn't 上生成“不”匹配吗?那是一个完全不同的水平:)
  • @JoeriHendrickx 对于我的需要,我认为这是可行的。感谢您的解决方案!
【解决方案2】:

利用 indexOf 怎么样?

s1 = s1.toLowerCase(Locale.US);
s2 = s2.toLowerCase(Locale.US);
int count = 0;
int x;
int y = s2.length();
while((x=s1.indexOf(s2)) != -1){
   count++;
   s1 = s1.substr(x,x+y);
}
return count;

高效版

    int count = 0;
    int y = s2.length();
    for(int i=0; i<=s1.length()-y; i++){
       int lettersMatched = 0;
       int j=0; 
       while(s1[i]==s2[j]){
           j++;
           i++; 
           lettersMatched++;
       }
       if(lettersMatched == y) count++;
    }   
    return count;

为了更有效的解决方案,您将不得不稍微修改 KMP 算法。 google一下,很简单。

【讨论】:

  • 嗯,第二个很难被击败。如果您非常关心性能,请将其与基于正则表达式的性能进行比较。就时钟周期而言,正则表达式匹配也不便宜。
【解决方案3】:

嗯,你可以用“split”来分隔单词,看看是否存在完全匹配的单词。 希望有帮助!

【讨论】:

  • 我忘了提到我还希望通过空格分隔的关键字匹配。例如。 match("today is", "Today is really great, is not that GREAT?") 应该返回 1。
【解决方案4】:

一个选项是正则表达式。基本上,听起来您正在寻找与左侧或右侧任何标点符号匹配的单词。所以:

“太好了。” “ 伟大的!” “ 伟大的 ” “ 伟大的,” “很棒”

都会匹配,但是

“最伟大的”

不会

【讨论】:

  • 我也希望“Great”匹配。此外,空格分隔的关键字也应该匹配。例如。 matches("today is", "Today is really great, isn't that GREAT?") 应该返回 1. 有关于工作正则表达式的建议吗?我真的不是这方面的专家..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多