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"?

私が見つけた最も近い質問はこれでしたが、これは 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 つを超えるキャプチャ グループがある場合は、次のように 2 桁の後方参照を使用してあいまいさを取り除くことができます。

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

将来の参考のために簡潔な回答を追加するだけです:

後方参照は最大 2 桁なので、後方参照 #1 の後にリテラル数字を使用するには、「1」ではなく「01」と呼びます。

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