Je recommanderais la réponse de Tim. Cependant, @blazs déclare "Supposons searchStr = aaa et que str = aaaaaa. Ensuite, au lieu de trouver 4 occurrences, votre code n'en trouvera que 2 car vous faites des sauts par searchStr.length dans la boucle.", Ce qui est vrai en regardant Code de Tim, spécifiquement cette ligne ici: startIndex = index + searchStrLen; Le code de Tim ne serait pas en mesure de trouver une instance de la chaîne recherchée dans la longueur d'elle-même. Donc, j'ai modifié la réponse de Tim:
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>
Le changer en "+ 1" au lieu de "+ searchStrLen" permettra à l'index 1 d'être dans le tableau des indices si j'ai une chaîne de "aaaa" et un searchStr de "aa".
Deuxième réponse
J'ai un autre extrait de code qui fonctionne également. Cela imite la réponse fournie par @YuJie, sauf que celle-ci est plus compacte que la réponse de Yu Jie:
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>
Cependant, l'inconvénient de cet extrait de code est qu'il peut prendre un peu plus de temps que le premier, car le premier utilise la fonction intégrée JavaScript indexOf (), tandis que le second est un peu comme le vieil adage "re -inventer la roue. " Donc, dans l'ensemble, je recommanderais ma première réponse au lieu de celle-ci. PS Si quelqu'un souhaite des commentaires dans le code pour expliquer le fonctionnement du code, veuillez le dire, et je serai heureux de répondre à la demande.
le
une chaîne variable ici? Même lorsque vous utiliseznew Regexp(str);
le danger des caractères spéciaux se cache, la recherche$2.50
par exemple. Quelque chose commeregex = new Regexp(dynamicstring.replace(/([\\.+*?\\[^\\]$(){}=!<>|:])/g, '\\$1'));
serait plus proche IMHO. Je ne sais pas si js a un mécanisme d'échappement regex intégré.