0

这种代码和平只返回第一个匹配的索引。但是我希望数组“结果”保存匹配项的所有索引。

function score(string,pattern) {
    var v = string.toUpperCase();
    var s = pattern.toUpperCase();
    var result = [];


    result.push(v.indexOf(s)); 
    return result.length;
}
4

2 回答 2

2

indexOf有第二个参数:start.

尝试这个:

function score(string,pattern) {
    var v = string.toUpperCase();
    var s = pattern.toUpperCase();
    var result = [];
    for (var i = 0; i < string.length; i++) {
        var index = v.indexOf(s, i);
        if (index != -1) {
            result.push(index);
            i = index;
        }
    }

我们基本上是在遍历字符串,总是跳到下一个出现的地方。尝试在 处设置断点result.push(index),这可能有助于理解代码。

于 2013-11-09T21:31:39.523 回答
1

您可以尝试使用正则表达式:

编辑:根据 Kay 的建议进行了改进

function score( str, pattern ) {
    pattern = pattern.replace( /([\[\]{}\\*+.?^$\(\)])/g, "\\$1" );

    var re = new RegExp( pattern, "ig" )
      , result = []
      , match
      ;

    while ( match = re.exec( str ) ){
        result.push( match.index );
    }

    return result;
}

score( "0AA34567AA01234AA78900", "AA" ); //[1, 8, 15]
score( "0[[34567[[01234[[78900", "[[" ); //[1, 8, 15]
于 2013-11-09T21:40:13.023 回答