用正则表达式替换匹配的第n个匹配项

时间:2017-03-22 05:00:26

标签: javascript regex string

我正试图找到一种替换更多匹配的第n场比赛的方法。

string = "one two three one one"

如何定位“one”的第二次出现?

是否可以做这样的事情?

string.replace(/\bone\b/gi{2}, "(one)")

得到这样的东西

"one two three (one) one"

我已经完成了一个正在运行的jsfiddle,但感觉不对。大量的代码和混淆一个简单的事情。

https://jsfiddle.net/Rickii/7u7pLqfd/

2 个答案:

答案 0 :(得分:1)

更新:

要动态使用它:

((?:.*?one.*?){1}.*?)one

其中值1表示(n-1);在你的情况下是n = 2

并替换为:

$1\(one\)

Regex101 Demo

const regex = /((?:.*?one.*?){1}.*?)one/m;
const str = `one two three one one asdfasdf one asdfasdf sdf one`;
const subst = `$1\(one\)`;
const result = str.replace(regex, subst);
console.log( result);

答案 1 :(得分:1)

更通用的方法是使用替换器功能。

// Replace the n-th occurrence of "re" in "input" using "transform"
function replaceNth(input, re, n, transform) {
  let count = 0;

  return input.replace(
    re, 
    match => n(++count) ? transform(match) : match);
}

console.log(replaceNth(
  "one two three one one", 
  /\bone\b/gi,
  count => count ===2,
  str => `(${str})`
));

// Capitalize even-numbered words.
console.log(replaceNth(
  "Now is the time",
  /\w+/g,
  count => !(count % 2),
  str => str.toUpperCase()));