这段代码只会返回第一个匹配的索引。但是我希望数组“result”保存匹配的所有索引。
function score(string,pattern) {
var v = string.toUpperCase();
var s = pattern.toUpperCase();
var result = [];
result.push(v.indexOf(s));
return result.length;
}
答案 0 :(得分: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)
设置断点,这可能有助于理解代码。
答案 1 :(得分: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]