Подтвердить что ты не робот

Javascript backreference с последующим номером

Если бы у меня было регулярное выражение, скажем, 13 групп захвата, как бы указать строку замены, содержащую первую обратную ссылку, за которой следует буква "3"?

var regex = /(one)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)/;
"one2345678910111213".replace(regex,"$13");
//Returns "13". How do I return "one3"?

Самый близкий вопрос, который я мог найти, был этот, но он относится к perl и не содержит жестко закодированный литерал.

Также посмотрел docs на MDN, но в примерах не было явно указано или продемонстрировано.

4b9b3361

Ответ 1

Хорошая добыча! Единственное решение, которое я смог придумать, это:

var regex = /(one)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)/;
"one2345678910111213".replace(regex, function(match, $1) { return $1 + "3"; } );

EDIT Я просмотрел спецификацию ECMAScript, и похоже, что это возможно без обратного вызова. Некоторые механизмы замены RegExp - например, Python - имеют конструкцию \g (для "group" ), где вы можете использовать что-то вроде \g{1}3 в строке замены; но JavaScript просто использует $nn. То есть, если у вас есть более 9 групп захвата, вы можете использовать двухзначную обратную ссылку для удаления двусмысленности, например:

"one2345678910111213".replace(regex, "$013" );

Ответ 2

Просто добавьте краткий ответ для дальнейшего использования:

Backreferences имеют не более двух цифр, поэтому для использования обратной ссылки # 1 следует буквальная цифра, назовите ее "01" вместо "1":

"one2345678910111213".replace(regex,"$013");