从段落中搜索文本 - Javascript?

3
我已经编写了以下代码来从段落中搜索我的名字,
 /*jshint multistr:true */

text = "Blah blah blah blah blah blah Elic \
blah blah blah Eric blah blah Eric blah blah \
blah blah blah blah blah Eric";

var myName = "Eric";
var hits = [];
var l=0;
var count=0;


// Look for "E" in the text
for(var i = 0; i < text.length; i++) {
    if (text[i] === "E") {

        for(var j = i; j < (myName.length + i); j++) {
           for(var k =1; k < 4; k++) {
            if(text[i+k] === myName[k]){

            hits.push(text[j]); 
            }
                else {
                    break;
                }

                }           
            }

        }
    }



if (hits.length === 0) {
    console.log("Your name wasn't found!");
} else {
    console.log(hits);
}

但是输出结果如下:

[ 'E', 'E', 'E', 'r', 'r', 'r', 'i', 'i', 'i', 'c', 'c', 'c', 'E', 'E', 'E', 'r', 'r', 'r', 'i', 'i', 'i', 'c', 'c', 'c', 'E', 'E', 'E', 'r', 'r', 'r', 'i', 'i', 'i', 'c', 'c', 'c' ]

我确定这是因为第三个for循环, 请提供一些建议来调整此代码,以便输出将如下所示:

[ 'E', 'r', 'i', 'c', 'E', 'r', 'i', 'c', 'E', 'r', 'i', 'c', 'E', 'r', 'i', 'c' ]

提前感谢您。

这是需要翻译的内容。
5个回答

4

1

var res = text.match(new RegExp(myName, 'g')).join('').split('');

2

var text = "Blah blah blah blah blah blah Elic \
blah blah blah Eric blah blah Eric blah blah \
blah blah blah blah blah Eric";

var myName = "Eric";
var hits   = [];
var l      = 0;
var count  = 0;
var foundName = '';  

for (var i = 0; i < text.length; i++) {
  foundName = '';

  if (text[i] === "E") {
    for (var j = 0; j < myName.length; j++) {
      foundName += text[i + j];                
    }

    if (foundName === myName) {
      for (var k = 0; k < myName.length; k++) {
        hits.push(foundName[k]);                
      }
    }
  }
}

console.log(hits);


2

您不需要这两个内部的 for 循环。当使用 break 时,您正在跳出最内层的 for 循环,但仍在运行第二个 for 循环。

请尝试使用以下内容替代这两个内部的 for 循环:(替换涉及 j 的 for 循环)

for (var k = 0; k < 4; k++) {
    if (text[i + k] === myName[k]) {
        hits.push(text[i + k]); 
    } else {
        break;
    }
}      

2
嗯,在这里,它没有打印出“E”。 - user2112700
[ 'r', 'i', 'c', 'r', 'i', 'c', 'r', 'i', 'c' ] 是输出结果。 - user2112700
@Vizkos 怎么了?在JavaScript中超出索引范围会返回“undefined”,这与“myName”中的任何可能字符都不相等。 - Allen
哦,没关系,我明白你的意思了。我不确定 OP 是否打算包含他名字的部分演绎(比如额外的“E”),所以我只是提供了我认为与他提供的代码最不相异的解决方案。 - Allen

1

不确定您希望如何处理结果,但假设您只想测试名称是否在字符串中,则可以使用.indexOf()方法:

var n = text.indexOf("Eric");

那么n的结果将显示第一个字符的索引位置,如果找不到匹配的单词,则返回-1

然后,您可以将其添加到简单测试中:

if(text.indexOf("Eric") <0){
     \\doStuff
}

0

你可以尝试使用 JavaScript 的 .indexOf() 函数。

text = "Blah blah blah blah blah blah Elic \
blah blah blah Eric blah blah Eric blah blah \
blah blah blah blah blah Eric";

if(text.indexOf('Eric') < 0 ){
    console.log("Your name wasn't found!");
}

你误解了重点,他可能正在尝试寻找一个名字,但问题要求的输出不是你提供的那个 :P - argentum47

0
请尝试这个...
     text = "Blah blah blah blah blah blah Elic lah blah blah Eric blah blah Eric blah blah blah blah blah blah blah Eric";

    var charFound=0;
    var myName = ['E' , 'r', 'i' ,'c'];
    var hits = [];
    var l=0;
    for(var i = 0; i < text.length; i++) 
    {
        if(text[i] === myName[charFound])
        {   
          charFound++;
        }
        else
        {
          continue;
          charFound=0;
        }
        if(charFound == 4)
        {
          for(var j = 0; j < 4;  j++)
          {
             hits.push(text[i-j]); 
            }
            charFound = 0;
        }
   }
   // Rearranging the hits counter to match the requirement
   for(var k = 0; k <hits.length/2; k++ )
   {
        var temp="";
        temp = hits[k];
        hits[k]= hits[hits.length-k-1];
        hits[hits.length-k-1] = temp;
   }
  alert(hits);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接