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, но в примерах не было явно указано или продемонстрировано.
Ответы
Ответ 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");