javascript - js字符串查找 - string indexof




查找字符串中指定字符的所有索引 (5)

例如,如果我在变量中有"scissors"并且想知道所有出现的字母"s" ,它应该打印出1, 4, 5, 8

如何以最有效的方式在JavaScript中执行此操作? 我不认为循环整体是非常有效的


当我对一切进行基准测试时,似乎正则表达式表现得最好,所以我想出了这个

function indexesOf(string, regex) {
    var match,
        indexes = {};

    regex = new RegExp(regex);

    while (match = regex.exec(string)) {
        if (!indexes[match[0]]) indexes[match[0]] = [];
        indexes[match[0]].push(match.index);
    }

    return indexes;
}

你可以这样做

indexesOf('ssssss', /s/g);

哪会回来

{s: [0,1,2,3,4,5]}

我需要一种非常快速的方法来匹配多个字符与大量文本,例如你可以这样做

indexesOf('dddddssssss', /s|d/g);

你会得到这个

{d:[0,1,2,3,4], s:[5,6,7,8,9,10]}

通过这种方式,您可以一次性获得所有匹配的索引


一个简单的循环很好:

var str = "scissors";
var indices = [];
for(var i=0; i<str.length;i++) {
    if (str[i] === "s") indices.push(i);
}

现在,您表明您想要1,4,5,8。 这将给你0,3,4,7,因为索引是从零开始的。 所以你可以添加一个:

if (str[i] === "s") indices.push(i+1);

现在它会给你预期的结果。

here可以看到一个小提琴。

我不认为循环整体是非常有效的

就性能而言,在你开始遇到问题之前,我不认为这是你需要严重担心的事情。

这是一个比较各种答案的jsPerf测试。 在Safari 5.1中,IndexOf表现最佳。 在Chrome 19中,for循环是最快的。


功能更有趣,也更通用:它查找字符串中任意长度的子字符串的起始索引

const length = (x) => x.length
const sum = (a, b) => a+b

const indexesOf = (substr) => ({
  in: (str) => (
    str
    .split(substr)
    .slice(0, -1)
    .map(length)
    .map((_, i, lengths) => (
      lengths
      .slice(0, i+1)
      .reduce(sum, i*substr.length)
    ))
  )  
});

console.log(indexesOf('s').in('scissors')); // [0,3,4,7]

console.log(indexesOf('and').in('a and b and c')); // [2,8]


您也可以使用javascript的match()函数。 您可以创建正则表达式,然后将其作为参数传递给match()。

stringName.match(/s/g);

这应该返回一个字母's'的所有出现的数组。


indices = (c, s) => s
          .split('')
          .reduce((a, e, i) => e === c ? a.concat(i) : a, []);

indices('?', 'a?g??'); // [1, 3, 4]




indexing