我对JavaScript很满意。我只是尝试了很多,但没有得到答案和信息,以显示如何计算一次长字符串中多个子字符串的出现。
进一步的信息:我需要得到这些子串的出现,如果它们的出现次数很多,我需要一次更换它们,所以我需要一次得到它。
这是一个例子: 长字符串Text,如下所示,
超级碗50是美国足球比赛,以确定2015赛季国家橄榄球联盟(NFL)的冠军。美国足球大会(AFC)冠军丹佛野马队以24-10击败国家足球大会(NFC)冠军卡罗莱纳黑豹队获得他们的第三个超级碗冠军。该游戏于2016年2月7日在加利福尼亚州圣克拉拉的旧金山湾区的李维斯体育场举行。由于这是第50届超级碗,联盟强调了各种以黄金为主题的“黄金纪念日”,以及暂时停止用罗马数字命名每个超级碗比赛的传统(根据该传统,比赛将被称为“超级碗L“),使徽标突出显示阿拉伯数字50。
子字符串是一个问题,但我需要的是一次计算该子字符串中的每个单词出现次数。例如,这个字符串中的“name”,“NFL”,“championship”,“game”和“is”,“the”这个词。
NFL冠军赛的名称是什么?
其中一个问题是文本中没有一些子字符串,有些已经多次显示。(我可能会替换它)
我在下面尝试过的代码,这是错的,我尝试了很多不同的方法,但没有很好的结果。
$(".showMoreFeatures").click(function(){
var text= $(".article p").text(); // This is to get the text.
var textCount = new Array();
// Because I use match, so for the first word "what", will return null, so
this is to avoid this null. and I was plan to get the count number, if it is
more than 7 or even more, I will replace them.
var qus = item2.question; //This is to get the sub-string
var checkQus = qus.split(" "); // I split the question to words
var newCheckQus = new Array();
// This is the array I was plan put the sub-string which count number less than 7, which I really needed words.
var count = new Array();
// Because it is a question as sub-string and have many words, so I wan plan to get their number and put them in a array.
for(var k =0; k < checkQus.length; k++){
textCount = text.match(checkQus[k],"g")
if(textCount == null){
continue;
}
for(var j =0; j<checkQus.length;j++){
count[j] = textCount.length;
}
//count++;
}
我尝试了许多不同的方式,搜索了很多,但没有很好的结果。上面的代码只是想表明我的尝试和我的想法(可能完全错误)。但实际上它不起作用,如果你知道如何实现它,解决我的问题,请告诉我,不需要纠正我的代码。
非常感谢。
答案 0 :(得分:0)
如果我已正确理解了问题,那么您似乎需要计算问题中单词(que
)出现在文本中的次数(txt
)......
var txt = "Super Bowl 50 was an American ...etc... Arabic numerals 50.";
var que = "What is the name of NFL championship game?";
我将在vanilla JavaScript中完成此操作,您可以根据需要将其转换为JQuery。
首先,要专注于文本,我们可以通过将字符串更改为小写并删除一些标点符号来使事情变得更简单。
// both strings to lowercase
txt = txt.toLowerCase();
que = que.toLowerCase();
// remove punctuation
// using double \\ for proper regular expression syntax
var puncArray = ["\\,", "\\.", "\\(", "\\)", "\\!", "\\?"];
puncArray.forEach(function(P) {
// create a regular expresion from each punctuation 'P'
var rEx = new RegExp( P, "g");
// replace every 'P' with empty string (nothing)
txt = txt.replace(rEx, '');
que = que.replace(rEx, '');
});
现在我们可以创建一个来自str
和que
的清理器数组以及来自que
的哈希表,如此...
// Arrays: split at every space
var txtArray = txt.split(" ");
var queArray = que.split(" ");
// Object, for storing 'que' counts
var queObject = {};
queArray.forEach(function(S) {
// create 'queObject' keys from 'queArray'
// and set value to zero (0)
queObject[S] = 0;
});
queObject
将用于记录计算的单词。如果你此时console.debug(queObject)
看起来像这样......
console.debug(queObject);
/* =>
queObject = {
what: 0,
is: 0,
the: 0,
name: 0,
of: 0,
nfl: 0,
championship: 0,
game: 0
}
*/
现在我们要测试txtArray
中的每个元素,看它是否包含queArray
中的任何元素。如果测试为true
,我们会在等效的queObject
属性中添加+1,就像这样...
// go through each element in 'queArray'
queArray.forEach(function(A) {
// create regular expression for testing
var rEx = new RegExp( A );
// test 'rEx' against elements in 'txtArray'
txtArray.forEach(function(B) {
// is 'A' in 'B'?
if (rEx.test(B)) {
// increase 'queObject' property 'A' by 1.
queObject[A]++;
}
});
});
我们在这里使用RegExp test
方法而不是String match
方法,因为我们只想知道&#34;是否在B == true&#34;中是A.如果为真,那么我们将相应的queObject
属性增加1.此方法还会在单词内找到单词,例如&#39; is&#39;在&#39; San Franc 是 co&#39;等
一切顺利,将queObject
记录到控制台会显示问题中每个单词出现在文本中的次数。
console.debug(queObject);
/* =>
queObject = {
what: 0
is: 2
the: 17
name: 0
of: 2
nfl: 1
championship: 0
game: 4
}
*/
希望有所帮助。 :)
有关以下内容的详情,请参阅MDN: