如何在字符串中出现第n个?

Ada*_*dam 92 javascript

我想获得的起始位置2nd发生ABC像这样的东西:

var string = "XYZ 123 ABC 456 ABC 789 ABC";
getPosition(string, 'ABC', 2) // --> 16
Run Code Online (Sandbox Code Playgroud)

你会怎么做?

Den*_*ret 145

function getPosition(string, subString, index) {
   return string.split(subString, index).join(subString).length;
}
Run Code Online (Sandbox Code Playgroud)

  • 我其实不喜欢这个答案.给定无限长度输入,它会不必要地创建一个无界长度数组,然后抛出大部分数据.只需迭代地将`fromIndex`参数用于`String.indexOf`就会更快,更有效 (22认同)
  • 如果您指定每个参数的含义,我会很高兴. (8认同)
  • 如果有``i`出现`m`,这将给你字符串的长度.也就是说,`getPosition("aaaa","a",5)`给出`4`,`getPosition("aaaa","a",72)`!在这些情况下,我认为你想要-1.`var ret = str.split(m,i).join(m).length; return ret> = str.length?-1:滞留;`你也可能要赶上'我<= 0`用`返回RET> = str.length || 我<= 0?-1:ret;` (4认同)
  • `function getPosition(str,m,i){return str.split(m,i).join(m).length; }` (3认同)
  • @Foreever 我只是简单地实现了 OP 定义的函数 (2认同)

ken*_*bec 61

您也可以使用字符串indexOf而不创建任何数组.

第二个参数是开始寻找下一个匹配的索引.

function nthIndex(str, pat, n){
    var L= str.length, i= -1;
    while(n-- && i++<L){
        i= str.indexOf(pat, i);
        if (i < 0) break;
    }
    return i;
}

var s= "XYZ 123 ABC 456 ABC 789 ABC";

nthIndex(s,'ABC',3)

/*  returned value: (Number)
24
*/
Run Code Online (Sandbox Code Playgroud)

  • 根据[jsperf](http://jsperf.com/asfsdfv234vwsy-cvwdasvcx/2),这种方法比接受的答案快 (7认同)
  • 荒谬的是,这不是 JS 的内置功能。 (2认同)

ilo*_*ett 16

根据kennebec的回答,我创建了一个原型函数,如果找不到第n个出现而不是0,它将返回-1.

String.prototype.nthIndexOf = function(pattern, n) {
    var i = -1;

    while (n-- && i++ < this.length) {
        i = this.indexOf(pattern, i);
        if (i < 0) break;
    }

    return i;
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至不是`String.prototype.smoochyBoochies`? (12认同)
  • **从不** *永远* 使用驼峰式大小写,因为本机特性的最终适应可能会无意中被这个原型覆盖。在这种情况下,我建议使用所有小写和下划线(URL 的破折号):`String.prototype.nth_index_of`。即使你认为你的名字足够独特和疯狂,世界也会证明它可以而且会做得更疯狂。 (2认同)
  • 不要扩展字符串原型。 (2认同)