search()字符串表示多次出现

时间:2013-05-12 01:18:50

标签: javascript string search

假设您有字符串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的位置。

3 个答案:

答案 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

如果您要搜索固定字符串,则可以提供继续搜索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);
    }
}

RegExp.exec

这是为了演示用法。对于固定字符串,请改用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;       
}