我正试图找到一种替换更多匹配的第n场比赛的方法。
string = "one two three one one"
如何定位“one”的第二次出现?
是否可以做这样的事情?
string.replace(/\bone\b/gi{2}, "(one)")
得到这样的东西
"one two three (one) one"
我已经完成了一个正在运行的jsfiddle,但感觉不对。大量的代码和混淆一个简单的事情。
答案 0 :(得分:1)
更新:
要动态使用它:
((?:.*?one.*?){1}.*?)one
其中值1表示(n-1);在你的情况下是n = 2
并替换为:
$1\(one\)
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()));