Как избежать группы захвата $N, за которой следует целое число при замене регулярного выражения JavaScript?

Я понимаю, что в JavaScript вы можете заменить регулярное выражение ссылкой на группы захвата, подобные этому:

> "Hello World 1234567890".replace(
        /Hello (World) (1)(2)(3)(4)(5)(6)(7)(8)(9)(0)/,
        "What up $1");
"What up World"

Это все хорошо. Но что, если я хочу ссылаться на группу 1, то сразу же следует "1". Скажите, что посмотреть "Что такое мир1". Поэтому я бы написал:

> "Hello World 1234567890".replace(
        /Hello (World) (1)(2)(3)(4)(5)(6)(7)(8)(9)(0)/,
        "What up $11");
"What up 0"

Конечно, в этом случае он ссылается на группу 11, которая является "0", вместо группы 1, а затем "1".

Как я могу решить эту двусмысленность?

Ответ 1

Вы можете использовать String#replace с аргументом функции обратного вызова:

str = "Hello World 1234567890";
repl = str.replace(/Hello (World) (1)(2)(3)(4)(5)(6)(7)(8)(9)(0)/, function(r, g) {
      return "What up " + g + '1';});

//=> What up World1

Ответ 2

Не делай этого ^^:

(1 + "Hello World 1234567890").replace(
    /(\d)Hello (World) (1)(2)(3)(4)(5)(6)(7)(8)(9)(0)/,
    "What up $2$1"
);