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

Java:查找给定字符串中的单词匹配数,java,string,search,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

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

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
到目前为止,我发现:

这仅在给定关键字存在时返回,而不返回出现的次数。此外,我不确定它是否忽略了对我来说很重要的区分大小写

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

更新

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

例如


如果返回1,您可以使用split来分隔单词,并查找是否存在完全匹配的单词。
希望有帮助

那么,您可以使用split来分隔单词,并查找是否存在完全匹配的单词。
希望有帮助

一个选项是RegEx。基本上,它听起来像是你在寻找一个单词与左边或右边的标点符号相匹配。因此:

太好了。 伟大的 伟大的 伟大的 伟大的

都会匹配,但是

伟大的


一个选项是RegEx。基本上,它听起来像是你在寻找一个单词与左边或右边的标点符号相匹配。因此:

太好了。 伟大的 伟大的 伟大的 伟大的

都会匹配,但是

伟大的


你不觉得利用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算法。只需谷歌一下,很简单。

利用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算法。只需谷歌一下,很简单。

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

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

不过,在某些外语中,您的语言差异可能会有所不同。

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

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

不过,您的语言水平可能会因某些外语而异。

请查看。。。java.lang.String中的方法。它可以完成所有需要的操作。text.indexOfkeyword返回关键字在文本中的位置。我需要的是出现的次数。是的,通过从上一个位置开始在子字符串中获取的索引,您可以非常轻松地计算源字符串中搜索字符串的实例数!嗯,好主意,但我认为这不是很有效。也许正则表达式会更快?看看索引。。。java.lang.String中的方法。它可以完成所有需要的操作。text.indexOfkeyword返回关键字在文本中的位置。我需要的是出现的次数。是的,通过从上一个位置开始在子字符串中获取的索引,您可以非常轻松地计算源字符串中搜索字符串的实例数!嗯,好主意,但我认为这不是很有效。也许正则表达式会更快?我忘了提到我也希望通过空格分隔的关键字匹配。今天的比赛真的很棒,不是吗?应该返回1。我忘了提到我还希望通过空格分隔的关键字匹配。今天的比赛真的很棒,不是吗?应该会返回1。我也希望能很好地匹配。此外,空格分隔的关键字也应该匹配。今天的比赛真的很棒,不是吗?应该返回1。有一个工作正则表达式的提议吗?我真的不是这方面的专家,我也很想和他比赛。此外,空格分隔的关键字也应该匹配。今天的比赛真的很棒,不是吗?应该返回1。有一个工作正则表达式的提议吗?我真的不是这方面的专家。这也适用于空格分隔的关键字吗?例如,Pattern.compile\\b今天是\\b.matchertext@valmar:如果您将其设置为不区分大小写,它也可以很好地匹配。@valmar,它的工作方式不同,当您对t进行匹配时,它会将最后一个t作为匹配。@Elite绅士:我想您可以使用不同的正则表达式忽略这些字符,但问题是:您如何定义一个单词;是否希望它为IS上的“not”生成匹配项?这是一个完全不同的层次:@JoeriHendrickx对于我的需要,我认为这很有效。谢谢你的解决方案!这也适用于空格分隔的关键字吗?例如,Pattern.compile\\b今天是\\b.matchertext@valmar:如果您将其设置为不区分大小写,它也可以很好地匹配。@valmar,它的工作方式不同,当您对t进行匹配时,它会将最后一个t作为匹配。@Elite绅士:我想您可以使用不同的正则表达式忽略这些字符,但问题是:您如何定义一个单词;是否希望它为IS上的“not”生成匹配项?这是一个完全不同的层次:@JoeriHendrickx对于我的需要,我认为这很有效。谢谢你的解决方案!嗯,第二个是har
我要打败他。如果您非常关心性能,请将其与基于regexp的性能进行比较。正则表达式匹配在时钟周期方面也不便宜。好吧,第二个很难打败。如果您非常关心性能,请将其与基于regexp的性能进行比较。正则表达式匹配在时钟周期方面也不便宜。