2012-11-06 20 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"; }); 

EDIT私はECMAScript specを見上げると、これは、コールバックなしで可能であるように見えます。いくつかのRegExp置換エンジン(Pythonなど)では、置換文字列に\g{1}3のようなものを使用することができる\g構造体(「グループ」用)があります。 JavaScriptはちょうど$nnを使用します。

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

1を、それはまだコールバックです。文字列引数でこれを行うことは不可能ですか? –

+0

正直なところ、私はコールバックを使用せずにそれを行う方法を知らない:私は様々なことを試みたが、これは働いた唯一のものだった。おそらく単純な文字列では不可能です。 – Xophmeister

+2

...可能です:)編集を参照してください! – Xophmeister

5

をジャスト今後の参考のための簡潔な答えを追加する:それはあなたがより9つのキャプチャグループを持っているならば、あなたはそうのような、曖昧さを取り除くために2桁の後方参照を使用することができ、ある

後方参照ではなく、「1」の「01」と呼んで、その文字通りの数字が続く後方参照#1を使用するために、ほとんどの2桁であります

"one2345678910111213".replace(regex,"$013"); 
関連する問題