11

如果我有一个包含 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"?

我能找到的最接近的问题是this one,但它与 perl 相关并且不包含硬编码的文字。

还查看了 MDN 上的文档,但示例中没有明确说明或演示。

4

2 回答 2

13

接得好!我能想出的唯一解决方案是:

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

编辑我查阅了ECMAScript 规范,看起来这在没有回调的情况下是可能的。一些 RegExp 替换引擎——例如 Python——有一个\g构造(用于“组”),您可以在其中使用类似于\g{1}3替换字符串的内容;但 JavaScript 只使用$nn. 也就是说,如果您有超过 9 个捕获组,则可以使用两位数的反向引用来消除歧义,如下所示:

"one2345678910111213".replace(regex, "$013" );
于 2012-11-06T10:01:35.503 回答
5

只是为了添加一个简洁的答案以供将来参考:

反向引用最多有两位数字,因此要使用反向引用 #1 后跟一个文字数字,将其称为“01”而不是“1”:

"one2345678910111213".replace(regex,"$013");
于 2013-11-20T16:46:55.987 回答