替换字符串的第一个到第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