问题是我想将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;
};
现在正在运作。
答案 0 :(得分:1)
这样的事情:
var myregex = /(.*?one-two){3}(.*)/;
result = yourString.replace(myregex, function(match) {
return match(1).replace(/one-two/g, "one") + match(2);
});
one-two
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