我想计算段落中特定单词的出现次数。
我正在编写关键事件的代码。我最初可能会有几百个单词,可能会在以后增加。
因此,当用户输入时,我将匹配段落中的单词,然后获取出现次数。我还需要确保匹配区分大小写。
现在我正在使用此代码:
$('.msg').val().split("AP").length - 1
AP是要匹配的关键字。
但我对此并不满意。
实际上我有几百个关键字的列表,我该如何有效地实现它。
请注意匹配的单词在两边都有空格,即它们是边界词
感谢任何帮助
答案 0 :(得分:2)
您可以尝试以下内容:
var wordList = ["some", "word", "or", "other", "CASE", "Sensitive", "is", "required"],
wordCount = [];
for (var i=0; i < wordList.length; i++)
wordCount[i] = 0;
$("#someField").keyup(function(){
var i,
text = this.value,
re;
for (i = 0; i < wordList.length; i++) {
re = new RegExp("\\b" + wordList[i] + "\\b", "g");
wordCount[i] = 0;
while (re.test(text)) wordCount[i]++;
}
});
演示:http://jsfiddle.net/zMdYg/2/(用更长的单词列表更新)
我真的不知道你想对结果做什么,所以我只是把它们放在一个简单的数组中,但你可以在演示中看到我然后将它们输出到页面,这样你就可以看到它正常工作了。显然你会在那个部分替换你自己的要求。
这是使用正则表达式来测试每个单词。您会注意到,使用.split()
或.indexOf()
您将获得部分匹配,例如,如果您查找“其他”,它也会在“麻烦”中途匹配(等等),但是正则表达式我使用\b
来测试单词边界。
对于大量的单词列表,您可能需要提前创建所有正则表达式,而不是在循环中动态重做它们,但它似乎对我的简单测试工作正常,所以我想我不会开始做过早的最佳化。我将把它作为读者的练习......
答案 1 :(得分:1)
如果split()不区分大小写,那么我会考虑使用indexOf(),它区分大小写。
所以可能是这样的:
var words_array = ['one', 'two', 'three'];
var carot = 0;
var n_occurences = 0;
$.each(words_array, function(index, value){
while(carot < $('.msg').val().length && carot > -1){
carot = $('.msg').val().indexOf(' ' + words_array[index] + ' ', carot);
if (carot > -1){
n_occurences++;
}
}
});
我没有对此进行过测试,但我希望你能得到这个想法。