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には 2 番目のパラメータがあります: 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 に答える