1. ホーム
  2. javascript

[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?

2022-07-12 20:38:18

質問

ある文字列が別の文字列の中に出現する位置を、大文字と小文字を区別せずに見つけようとしています。

例えば、文字列が与えられた場合。

私はレバノンでウクレレを習いました。

と検索文字列 le のように,配列を取得したい.

[2, 25, 27, 33]

どちらの文字列も変数になります。つまり、その値をハードコードすることはできません。

私はこれが正規表現のための簡単なタスクであると考えましたが、うまくいくものを見つけるのにしばらく格闘した後、私は運がなかったです。

私が見つけたのは この例 を使用してこれを達成する方法の .indexOf() しかし、きっともっと簡潔なやり方があるはずです。

どのように解決するのですか?

var str = "I learned to play the Ukulele in Lebanon."
var regex = /le/gi, result, indices = [];
while ( (result = regex.exec(str)) ) {
    indices.push(result.index);
}

アップデイト

元の質問で、検索文字列が変数である必要があることを見落としました。私はこのケースに対処するために、別のバージョンを書きました。 indexOf を使用する別のバージョンを書きましたので、元に戻ります。コメントで Wrikken が指摘したように、正規表現でこれを一般的なケースで行うには、特殊な正規文字をエスケープする必要があります。

function getIndicesOf(searchStr, str, caseSensitive) {
    var searchStrLen = searchStr.length;
    if (searchStrLen == 0) {
        return [];
    }
    var startIndex = 0, index, indices = [];
    if (!caseSensitive) {
        str = str.toLowerCase();
        searchStr = searchStr.toLowerCase();
    }
    while ((index = str.indexOf(searchStr, startIndex)) > -1) {
        indices.push(index);
        startIndex = index + searchStrLen;
    }
    return indices;
}

var indices = getIndicesOf("le", "I learned to play the Ukulele in Lebanon.");

document.getElementById("output").innerHTML = indices + "";
<div id="output"></div>