11

If I had a regular expression with, say 13 capturing groups, how would I specify a replacement string that contained the first backreference followed by the literal '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"?

The closest question I could find was this one, but it pertains to perl and did not include a hardcoded literal.

Also had a look at the docs on MDN, but there was nothing explicitly stated or demonstrated in the examples.

Community
  • 1
  • 1
Asad Saeeduddin
  • 46,193
  • 6
  • 90
  • 139

2 Answers2

14

Good catch! The only solution I've been able to come up with is:

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 I looked up the ECMAScript spec and it looks like this is possible without a callback. Some RegExp replacement engines -- Python, for example -- have a \g construct (for "group"), where you can use something like \g{1}3 in the replacement string; but JavaScript just uses $nn. That is, if you've got more than 9 capturing groups, you can use a two-digit back reference to remove the ambiguity, like so:

"one2345678910111213".replace(regex, "$013" );
Xophmeister
  • 8,884
  • 4
  • 44
  • 87
  • +1, but that's still a callback. Does that mean it is impossible to do this with a string argument? – Asad Saeeduddin Nov 06 '12 at 10:05
  • Honestly, I don't know how to do it without using a callback: I tried various things, but this was the only one that worked. Perhaps it's not possible with a simple string. – Xophmeister Nov 06 '12 at 10:07
  • The solution to use $013 doesn't seem limited to cases where you have more than nine capturing groups. – Peter Herdenborg Mar 10 '14 at 11:19
6

Just to add a concise answer for future reference:

Backreferences have at most two digits, so to use backreference #1 followed by a literal numeral, call it "01" instead of "1":

"one2345678910111213".replace(regex,"$013");
Nate Cook
  • 92,417
  • 32
  • 217
  • 178