Javascript 搜索()字符串以查找多个匹配项

Javascript 搜索()字符串以查找多个匹配项,javascript,string,search,Javascript,String,Search,假设你有字符串,黑猫杰克黑猫杰克黑猫杰克 如何使用search()查找第二个出现的单词jack 我猜代码应该是这样的: var str = "Black cat jack black cat jack black cat jack"; var jack = str.search('jack'); 但这将只返回字符串中第一次出现的jack的位置。您可以在循环中使用 var pos = foo.indexOf("jack"); while(pos > -1) { pos = foo

假设你有字符串,
黑猫杰克黑猫杰克黑猫杰克

如何使用
search()
查找第二个出现的单词
jack

我猜代码应该是这样的:

var str = "Black cat jack black cat jack black cat jack";
var jack = str.search('jack');
但这将只返回字符串中第一次出现的
jack
的位置。

您可以在循环中使用

var pos = foo.indexOf("jack");
while(pos > -1) {
     pos = foo.indexOf("jack", pos+1);
}
使用建议 请注意,该方法适用于
RegExp
——如果您提供一个字符串,那么它将隐式地将其转换为
RegExp
。它或多或少与
RegExp.test
具有相同的用途,您只想知道字符串中是否有与
RegExp
匹配的内容

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

String.indexOf 如果要搜索固定字符串,则可以提供要继续搜索的位置:

我添加
searchStr.length
以防止重叠匹配,例如在
ababababacccc
中搜索
abab
,如果我添加
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
的额外开销。

例如:


请注意,上面的示例将为您提供非重叠匹配。如果要查找重叠的匹配项,则需要设置
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;       
}

“某人有一件漂亮的夹克”。indexOf('jack')//19
我认为这样简单的任务不需要正则表达式。你也不知道他需要什么边界。更不用说你的解决方案对“盒子里的杰克”这样的词是行不通的。如果需要边界,他可以检查找到的单词后的下一个符号。它可以很容易地用正则表达式来处理,而使用
indexOf
如果不明确知道边界,或者多次调用
indexOf
是不可能的,这将是非常低效的。
indexOf
解决方案很简单,但在我看来太幼稚了。
// 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);
}
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;       
}