问题是我想在1st事件上替换某个字符串直到nth事件。其中n可以是任何数字。

示例测试字符串:

// 'one-two' the string I want to search
var str = "73ghone-twom2j2hone-two2717daone-two213";


我需要用"one-two"替换第一个"one"直到第n个匹配项。

//so in terms of function. i need something like:
function replaceByOccurence(testSring, regex, nthOccurence) {
    //implementation here
}


给定上述功能,如果我将3作为nthOccurence传递,则它应将第一个匹配项替换为第三个匹配项。如果我将2传递为nthOccurence,则应将第一个匹配项替换为第二个匹配项,因此在我们的示例中,如果我们通过2,则应返回"73ghonem2j2hone2717daone-two213"。请注意,第三个"one-two"不会替换为"one"

有人可以帮忙吗?
我搜索了,但在这里找不到类似的问题。



迷你更新[已解决:请检查最新更新]

因此,我使用了@anubhava的第一个解决方案,并尝试将其作为函数放入String中。
我这样写:

String.prototype.replaceByOccurence = function(regex, replacement, nthOccurence) {
    for (var i = 0; i < nthOccurence; i++)
        this = this.replace(regex, replacement);
    return this;
};

//usage
"testtesttest".replaceByOccurence(/t/, '1', 2);


显然我收到参考错误。它说left side assignment is not a reference并且它指向this = this.replace(regex, replacement)



最后更新

我将代码更改为此:

String.prototype.replaceByOccurence = function (regex, replacement, nthOccurence) {
    if (nthOccurence > 0)
        return this.replace(regex, replacement)
        .replaceByOccurence(regex, replacement, --nthOccurence);

    return this;
};


现在正在工作。

最佳答案

我认为简单的循环可以完成这项工作:

function replaceByOccurence(input, regex, replacement, nthOccurence) {
    for (i=0; i<nthOccurence; i++)
       input = input.replace(regex, replacement);
    return input;
}


并将其称为:

var replaced = replaceByOccurence(str, /one-two/, 'one', 3);


编辑:没有循环的另一个版本

function replaceByOccurence(input, regex, replacement, num) {
    i=0;
    return input.replace(regex, function($0) { return (i++<num)? replacement:$0; });
}


并将其称为:

var replaced = replaceByOccurence(str, /one-two/g, 'one', 3);
//=> 73ghtwom2j2htwo2717datwo213

09-25 16:20