Tim'in cevabını tavsiye ederim. Ancak, @blazs tarafından yapılan bu yorum "searchStr = aaa ve str = aaaaaa olduğunu varsayalım. O zaman 4 oluşum bulmak yerine kodunuz yalnızca 2 bulacaktır çünkü döngüde searchStr.length ile atlama yapıyorsunuz." Tim'in koduna, özellikle buradaki şu satıra bakarak: Tim'in kodu, startIndex = index + searchStrLen;
aranan dizenin kendi uzunluğu dahilinde olan bir örneğini bulamayacaktır. Bu yüzden, Tim'in cevabını değiştirdim:
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>
Bunun + 1
yerine olarak değiştirmek + searchStrLen
, eğer bir str aaaa
ve bir searchStr varsa dizin 1'in indices dizisinde olmasına izin verecektir aa
.
İkinci cevap
Ayrıca çalışan başka bir kod pasajım var:
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>
Bununla birlikte, bu pasajın dezavantajı, birincisinin yerleşik JavaScript işlevini kullandığı için birincisinden biraz daha uzun sürebileceğidir indexOf()
, ikincisi ise biraz eski deyim " tekerlek. " Yani, genel olarak, bunun yerine ilk cevabımı tavsiye ederim. Not: Herhangi biri kodun nasıl çalıştığını açıklamak için kodda yorum almak isterse, lütfen bunu söyleyin, isteğe yanıt vermekten memnuniyet duyarım.
le
Burada değişken bir dizge nasıl olur ?new Regexp(str);
Özel karakter tehlikesini kullanırken bile ,$2.50
örneğin aramak pusuda .regex = new Regexp(dynamicstring.replace(/([\\.+*?\\[^\\]$(){}=!<>|:])/g, '\\$1'));
IMHO gibi bir şey daha yakın olacaktır. Js'nin yerleşik bir normal ifade çıkış mekanizması olup olmadığından emin değilim.