2

假设你有字符串,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字符串中第一次出现的位置。

4

3 回答 3

3

您可以在循环中使用indexof 方法

var pos = foo.indexOf("jack");
while(pos > -1) {
     pos = foo.indexOf("jack", pos+1);
}
于 2013-05-12T01:23:36.423 回答
2

使用建议

请注意,该String.search方法适用于RegExp- 如果您提供一个字符串,那么它将隐式将其转换为RegExp. 它或多或少与 有相同的目的RegExp.test,您只想知道RegExp字符串中是否有匹配项。

如果您想搜索固定字符串,那么我建议您坚持使用String.indexOf. 如果您真的想使用模式,那么您应该使用RegExp.exec来获取所有匹配项的索引。

String.indexOf

如果您正在搜索固定字符串,则可以提供恢复搜索的位置String.indexOf

str.indexOf(searchStr, lastMatch + searchStr.length);

我添加searchStr.length以防止重叠匹配,例如搜索ababin 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"搜索字符串之类的东西)。

于 2013-05-12T01:24:16.013 回答
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;       
}
于 2018-12-11T18:02:32.710 回答