替换字符串的第1到第n个匹配。 JavaScript的

时间:2014-07-04 02:17:09

标签: javascript regex replace pattern-matching

问题是我想将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传递,则应将第一场比赛替换为第3场比赛。如果我将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;
};

现在正在运作。

2 个答案:

答案 0 :(得分:1)

这样的事情:

var myregex = /(.*?one-two){3}(.*)/;
result = yourString.replace(myregex, function(match) {
  return  match(1).replace(/one-two/g, "one") + match(2);
});
  • 匹配是整个字符串
  • match(1)是字符串的开头,直到第三个one-two
  • match(2)是字符串的其余部分
  • 我们用转换后的匹配(1)替换字符串(我们已将one-two替换为one)加上字符串的其余部分

答案 1 :(得分:1)

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

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