如何在JavaScript中查找另一个string的所有出现的索引?

我试图在另一个string中查找所有出现的string的位置,不区分大小写。

例如,给定string:

 我学会了在黎巴嫩玩尤克里里。 

和searchstringle ,我想获得数组:

 [2, 25, 27, 33] 

这两个string将是variables – 即,我不能硬编码他们的价值观。

我觉得这对于正则expression式来说是一件容易的事情,但是经过一段时间的努力find一个能够工作的东西,我没有运气。

我发现这个如何使用.indexOf()完成这个例子 ,但是肯定必须有一个更简洁的方法来做到这一点?

 var str = "I learned to play the Ukulele in Lebanon." var regex = /le/gi, result, indices = []; while ( (result = regex.exec(str)) ) { indices.push(result.index); } 

UPDATE

我没有发现原来的问题,searchstring需要是一个variables。 我写了另一个版本来处理这个使用indexOf ,所以你回到你开始的地方。 正如Wrikken在评论中指出的那样,为了使用正则expression式来处理一般情况,您需要转义特殊的正则expression式字符,在这一点上,我认为正则expression式的解决scheme变得比它更值得头痛。

 function getIndicesOf(searchStr, str, caseSensitive) { var searchStrLen = searchStr.length; if (searchStrLen == 0) { return []; } var startIndex = 0, index, indices = []; if (!caseSensitive) { str = str.toLowerCase(); searchStr = searchStr.toLowerCase(); } while ((index = str.indexOf(searchStr, startIndex)) > -1) { indices.push(index); startIndex = index + searchStrLen; } return indices; } var indices = getIndicesOf("le", "I learned to play the Ukulele in Lebanon."); document.getElementById("output").innerHTML = indices + ""; 
 <div id="output"></div> 
函数索引(source,find){
   var result = [];
   for(i = 0; i <source.length; ++ i){
     //如果你想search不区分大小写的使用 
     // if(source.substring(i,i + find.length).toLowerCase()== find){
     if(source.substring(i,i + find.length)== find){
       result.push(ⅰ);
     }
   }
  返回结果;
 }

指标(“我学会了在黎巴嫩玩四弦琴”,“乐”)

你当然可以做到这一点!

 //make a regular expression out of your needle var needle = 'le' var re = new RegExp(needle,'gi'); var haystack = 'I learned to play the Ukulele'; var results = new Array();//this is the results you want while (re.exec(haystack)){ results.push(re.lastIndex); } 

编辑:学习拼写RegExp

另外,我意识到这不是你想要的,因为lastIndex告诉我们针的末端不是开始,但它是接近的 – 你可以将re.lastIndex-needle.length推入结果数组中…

编辑:添加链接

@Tim Down的答案使用了RegExp.exec()中的结果对象,而我所有的Javascript资源都使用它(除了给你匹配的string外)。 所以当他使用result.index ,这是某种未命名的匹配对象。 在exec的MDC描述中 ,他们实际上对这个对象进行了详细的描述。

使用String.prototype.match 。

以下是MDN文档本身的一个例子:

 var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; var regexp = /[AE]/gi; var matches_array = str.match(regexp); console.log(matches_array); // ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e'] 
 function countInString(searchFor,searchIn){ var results=0; var a=searchIn.indexOf(searchFor) while(a!=-1){ searchIn=searchIn.slice(a*1+searchFor.length); results++; a=searchIn.indexOf(searchFor); } return results; } 

下面的代码将为你做这个工作:

 function indexes(source, find) { var result = []; for(i=0;i<str.length; ++i) { // If you want to search case insensitive use // if (source.substring(i, i + find.length).toLowerCase() == find) { if (source.substring(i, i + find.length) == find) { result.push(i); } } return result; } indexes("hello, how are you", "ar")