2

私が遭遇した問題を単純化しました。
Chrome で次のコードを実行すると、奇妙な動作が発生します。

var a = "$&";
var b = "aba";

var c = b.replace(/a/, a);

console.log(c); // expected output is: "$&b$&"
                // but output is:      "aba"

しかし、次のコードを実行すると、期待される出力が得られます

var a = "c";
var b = "aba";

var c = b.replace(/a/, a);

console.log(c); // expected output is: "cbc"
                // and output is:      "cbc"

これを解決する方法はありますか?
これはバグですか?
何らかの方法で変数 a の文字列をエスケープする必要がありますか?

4

3 に答える 3

4

置換文字列で使用する場合は、 を使用$してエスケープする必要があります$$文字は後方参照として使用されます$:

var a,
    b,
    c;
a = "$$&";
b = "aba";
c = b.replace(/a/, a);
console.log(c); //$&ba

文字列内のパターンのすべてのインスタンスを置き換えたい場合は、正規表現を global としてマークする必要があります。

var a,
    b,
    c;
a = "$$&";
b = "aba";
c = b.replace(/a/g, a);
console.log(c); //$&b$&
于 2012-10-12T19:52:23.523 に答える
2

$後方参照文字です。置換文字列では特別な意味があります。

この関連する質問を参照してください:
JavaScript - string regex backreferences

または、より詳細なドキュメントについては、次のページを参照してください:
http://www.regular-expressions.info/javascript.html#replace

交換品を修正するには、次を試してください。

var a = "$$&";
var b = "aba";

var c = b.replace(/a/g, a);

編集:グローバル置換文字を忘れました。追加した。

于 2012-10-12T19:47:13.273 に答える
0

2つの問題:

(1)すべてのオカレンスを置き換える場合は、/g修飾子を使用する必要があります

(2)$&正規表現の文字列にはパターン一致の意味があるため、一致を単独で置き換えていました

まとめると、ドル記号を別の記号でエスケープしてコードを変更する必要があります... >>

var a = "$$&"; 
var b = "aba"; 
var c = b.replace(/a/g, a);
于 2012-10-12T20:04:06.260 に答える