Java:查找给定字符串中的单词匹配数

时间:2011-10-28 12:50:50

标签: java string search

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

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

这仅返回如果给定关键字,但 出现的次数。此外,我不确定它是否忽略区分大小写(这对我很重要)。

请记住,应该忽略子串!我只想找到完整的单词


更新

我忘了提到我也想要通过空格分隔的关键字来匹配。

E.g。

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

应该返回1

4 个答案:

答案 0 :(得分: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它,它很简单。

答案 1 :(得分:1)

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

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

但你的语言可能因某些外语而异。

答案 2 :(得分:0)

好吧,您可以使用“拆分”来分隔单词并查找是否存在完全匹配的单词。 希望有所帮助!

答案 3 :(得分:0)

一个选项是RegEx。基本上听起来你正在寻找一个单词与左边或右边的任何标点符号。这样:

“很棒。” “好极了!” “很棒” “很棒,” “大”

会全部匹配,但

“最大”

不会