Вы сделали бы это с помощью функции-оболочки вокруг вызова:
x.replace(regex, (m, c0) => timesThree(c0));
Live Пример:
const x = "foo OFFSET_5 bar";
const regex = /OFFSET_(-?[0-9]*)\b/g;
function timesThree(n){ return n*3 }
console.log(x.replace(regex, (m, c0) => timesThree(c0)));
или в ES5:
x.replace(regex, function(m, c0){ return timesThree(c0); });
Live Пример:
var x = "foo OFFSET_5 bar";
var regex = /OFFSET_(-?[0-9]*)\b/g;
function timesThree(n){ return n*3 }
console.log(x.replace(regex, function(m, c0){ return timesThree(c0); }));
Это работает, потому что функция вызывается с общим соответствием в качестве первого аргумента (m
, который мы не используем), а затем с каждым захваченным текстом каждой группы захвата. в качестве последующего аргумента (c0
в этом случае). Таким образом, мы передаем текст первой группы захвата в timesThree
, который неявно преобразует строку в число через *
. Полученное число неявно преобразуется обратно в строку и вставляется.