假设您有字符串Black cat jack black cat jack black cat jack
。
您如何使用search()
查找单词jack
的第二次出现?
我猜测代码看起来像是:
var str = "Black cat jack black cat jack black cat jack";
var jack = str.search('jack');
但这只会返回字符串中第一次出现jack
的位置。
答案 0 :(得分:3)
您可以在循环中使用indexof method
var pos = foo.indexOf("jack");
while(pos > -1) {
pos = foo.indexOf("jack", pos+1);
}
答案 1 :(得分:2)
请注意,String.search
方法适用于RegExp
- 如果您提供字符串,则会隐式将其转换为RegExp
。它或多或少具有与RegExp.test
相同的目的,您只想知道字符串中RegExp
是否匹配。
如果您想搜索固定字符串,我建议您坚持使用String.indexOf
。如果你真的想使用模式,那么你应该使用RegExp.exec
来获取所有匹配的索引。
如果您要搜索固定字符串,则可以提供继续搜索String.indexOf
的位置:
str.indexOf(searchStr, lastMatch + searchStr.length);
我添加searchStr.length
以防止重叠匹配,例如在abab
中搜索abababacccc
,如果我添加searchStr.length
,则只会找到一个匹配项。如果要查找所有匹配项,请将其更改为+ 1
,无论重叠如何。
完整示例:
var lastMatch;
var result = [];
if ((lastMatch = str.indexOf(searchStr)) >= 0) {
result.push(lastMatch);
while ((lastMatch = str.indexOf(searchStr, lastMatch + searchStr.length)) >= 0) {
result.push(lastMatch);
}
}
这是为了演示用法。对于固定字符串,请改用String.indexOf
- 在固定字符串的情况下,RegExp
不需要额外的开销。
作为RegExp.exec
的示例:
// Need g flag to search for all occurrences
var re = /jack/g;
var arr;
var result = [];
while ((arr = re.exec(str)) !== null) {
result.push(arr.index);
}
请注意,上面的示例将为您提供非重叠匹配。如果要查找重叠匹配(re.lastIndex
没有匹配搜索字符串,则需要设置"jack"
。)
答案 2 :(得分:0)
我已经找到了解决方案-调用该函数以递归方式搜索并替换原始字符串,直到不再出现该单词:
function ReplaceUnicodeChars(myString) {
var pos = myString.search("&#");
if (pos != -1) {
// alert("Found unicode char in string " + myString + ", position " + pos);
unicodeChars = myString.substr(pos, 6);
decimalChars = unicodeChars.substr(2, 3);
myString = myString.replace(unicodeChars, String.fromCharCode(decimalChars));
}
if (myString.search("&#") != -1)
// Keep calling the function until there are no more unicode chars
myString = ReplaceUnicodeChars(myString);
return myString;
}