2012-11-06 67 views
10

如果我有一個正則表達式,比如說13個捕獲組,我將如何指定一個替換字符串,其中包含第一個反向引用,後跟字面'3'?Javascript反向引用其次是數字

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上的docs,但沒有在示例中明確說明或證明的內容。

回答

12

好抓!我已經能夠想出的唯一辦法是:

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 spec,它看起來像這是沒有可能的回調。一些RegExp替換引擎(例如Python)有一個\g構造(用於「組」),您可以在替換字符串中使用\g{1}3之類的東西;但JavaScript只是使用$nn。也就是說,如果你有超過9個捕獲組,你可以使用一個兩位數的回參考消除不確定性,就像這樣:

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

+1,但是這仍然是一個回調。這是否意味着用字符串參數做這件事是不可能的? –

+0

老實說,我不知道怎麼做,沒有使用回調:我嘗試了各種各樣的東西,但這是唯一的工作。也許用簡單的字符串是不可能的。 – Xophmeister

+2

...這是可能的:)見編輯! – Xophmeister

5

我想補充一個簡潔的答案以供將來參考:

反向引用最多有兩個數字,所以使用逆向引用#1後面文字數字,把它叫做「01」,而不是「1」:

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