这种代码和平只返回第一个匹配的索引。但是我希望数组“结果”保存匹配项的所有索引。
function score(string,pattern) {
var v = string.toUpperCase();
var s = pattern.toUpperCase();
var result = [];
result.push(v.indexOf(s));
return result.length;
}
这种代码和平只返回第一个匹配的索引。但是我希望数组“结果”保存匹配项的所有索引。
function score(string,pattern) {
var v = string.toUpperCase();
var s = pattern.toUpperCase();
var result = [];
result.push(v.indexOf(s));
return result.length;
}
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)
,这可能有助于理解代码。
您可以尝试使用正则表达式:
编辑:根据 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]