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的性能进行比较。正则表达式匹配在时钟周期方面也不便宜。