假设你有字符串,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
字符串中第一次出现的位置。
假设你有字符串,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
字符串中第一次出现的位置。
您可以在循环中使用indexof 方法
var pos = foo.indexOf("jack");
while(pos > -1) {
pos = foo.indexOf("jack", pos+1);
}
请注意,该String.search
方法适用于RegExp
- 如果您提供一个字符串,那么它将隐式将其转换为RegExp
. 它或多或少与 有相同的目的RegExp.test
,您只想知道RegExp
字符串中是否有匹配项。
如果您想搜索固定字符串,那么我建议您坚持使用String.indexOf
. 如果您真的想使用模式,那么您应该使用RegExp.exec
来获取所有匹配项的索引。
如果您正在搜索固定字符串,则可以提供恢复搜索的位置String.indexOf
:
str.indexOf(searchStr, lastMatch + searchStr.length);
我添加searchStr.length
以防止重叠匹配,例如搜索abab
in abababacccc
,如果添加 ,则只会找到 1 个匹配项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"
搜索字符串之类的东西)。
我想出了这个解决方案 - 调用递归搜索和替换原始字符串的函数,直到找不到更多出现的单词:
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;
}