如何在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")