替换字符串的第一个到第n个匹配项。javascript
问题是,我想在替换字符串的第一个到第n个匹配项。javascript,javascript,regex,replace,pattern-matching,Javascript,Regex,Replace,Pattern Matching,问题是,我想在1st出现时间到nth出现时间之间替换某个字符串。其中n可以是任何数字 样本测试字符串: // 'one-two' the string I want to search var str = "73ghone-twom2j2hone-two2717daone-two213"; 我需要将第一个“一两个”替换为第n个匹配项“一个” 给定上述函数,如果我将3作为nThoccurrence传递,它应该将第一个匹配替换为第三个匹配。如果我将2传递为nThoccurrence,它应该将第一个
1st
出现时间到nth
出现时间之间替换某个字符串。其中n
可以是任何数字
样本测试字符串:
// 'one-two' the string I want to search
var str = "73ghone-twom2j2hone-two2717daone-two213";
我需要将第一个“一两个”
替换为第n个匹配项“一个”
给定上述函数,如果我将3
作为nThoccurrence
传递,它应该将第一个匹配替换为第三个匹配。如果我将2
传递为nThoccurrence
,它应该将第一个匹配替换为第二个匹配,因此在我们的示例中,如果传递2
,它应该返回“73ghonem2j2hone2717daone-two213”
。请注意,第三个“一两个”
不会被替换为“一个”
有人能帮忙吗?
我搜索过了,但在这里找不到类似的问题
小更新[已解决:检查上次更新] 所以我使用了@anubhava的第一个解决方案,并尝试将其作为函数放入字符串中。 我是这样写的:
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);
现在它正在工作。类似这样的东西:
var myregex = /(.*?one-two){3}(.*)/;
result = yourString.replace(myregex, function(match) {
return match(1).replace(/one-two/g, "one") + match(2);
});
- 这场比赛是全部比赛
- 匹配(1)是字符串的开头,直到第三个
一两个
- 匹配项(2)是字符串的其余部分
- 我们用转换后的匹配项(1)替换字符串(其中我们用
替换了one
)加上字符串的其余部分one
- 我认为简单循环可以完成以下任务:
function replaceByOccurence(input, regex, replacement, nthOccurence) {
for (i=0; i<nthOccurence; i++)
input = input.replace(regex, replacement);
return input;
}
编辑:不循环的另一版本
function replaceByOccurence(input, regex, replacement, num) {
i=0;
return input.replace(regex, function($0) { return (i++<num)? replacement:$0; });
}
从第一次匹配到第三次匹配的
1-2
,您的预期输出是什么?@anubhava预期输出是:“73ghonem2j2hone2717daone213”
。哇。谢谢你。有没有办法只用正则表达式就可以做到这一点?不确定一个正则表达式是否可以在Javascript中做到这一点。
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