Я бы порекомендовал ответ Тима. Однако @blazs утверждает: «Предположим, что searchStr = aaa и что str = aaaaaa. Тогда вместо поиска 4 вхождений ваш код найдет только 2, потому что вы делаете пропуски по searchStr.length в цикле», что верно, если посмотреть на Код Тима, а именно эта строка здесь: startIndex = index + searchStrLen; Код Тима не сможет найти экземпляр строки, в которой выполняется поиск, которая находится в пределах самой длины. Итак, я изменил ответ Тима:
function getIndicesOf(searchStr, str, caseSensitive) {
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 + 1;
}
return indices;
}
var indices = getIndicesOf("le", "I learned to play the Ukulele in Lebanon.");
document.getElementById("output").innerHTML = indices + "";
<div id="output"></div>
Изменение его на «+ 1» вместо «+ searchStrLen» позволит индексу 1 быть в массиве индексов, если у меня есть str «aaaa» и searchStr «aa».
Второй ответ
У меня есть еще один фрагмент кода, который тоже работает. Он имитирует ответ, предоставленный @YuJie, за исключением того, что этот более компактный, чем ответ Ю Джи:
function getIndicesOf(searchStr, str, caseSensitive) {
var startIndex = 0, index, indices = [];
if (!caseSensitive) {
str = str.toLowerCase();
searchStr = searchStr.toLowerCase();
}
for (var i=0; i<str.length-1; i++) {
if (str.substr(i, searchStr.length) == searchStr) {
indices.push(i);
}
}
return indices;
}
var indices = getIndicesOf("le", "I learned to play the Ukulele in Lebanon.");
document.getElementById("output").innerHTML = indices + "";
<div id="output"></div>
Однако недостатком этого фрагмента является то, что он может занять немного больше времени, чем первый, поскольку первый использует встроенную функцию JavaScript indexOf (), тогда как второй немного похож на старую поговорку "re -изобретая колесо ". Итак, в целом, я бы порекомендовал свой первый ответ вместо этого. PS Если кому-то нужны комментарии в коде, объясняющие, как он работает, скажите об этом, и я буду рад ответить на запрос.
le
быть переменная строка? Даже при использованииnew Regexp(str);
специальных символов таится опасность, например поиск$2.50
.regex = new Regexp(dynamicstring.replace(/([\\.+*?\\[^\\]$(){}=!<>|:])/g, '\\$1'));
ИМХО было бы что-то вроде бы поближе. Я не уверен, есть ли в js встроенный механизм экранирования регулярных выражений.