1

文字列の一部がオブジェクト オプションに置き換えられるマイクロ テンプレート スクリプトを作成しています。以下に短い例を示します。

var person = {name:"Smith",age:43};
var string = "I am {name} and I am {age} years old";

document.write(string.replace(/{([\s\S]+?)}/g,(person['$1']||"")));
document.write("<br/>");
document.write(string.replace(/{([\s\S]+?)}/g
              , function($0,$1){return person[$1]||"";}));

JS Fiddleでも

2 番目の式は正常に機能しますが、最初の式は機能しません。誰でも理由を説明できますか?$1文字列内の後方参照として直接使用できると思いました。

4

4 に答える 4

1

$1, $2, ...,$&は、 に渡される文字列値の一部である場合にのみ使用できますreplace

string.replace(/{([\s\S]+?)}/g, '$1(matched)');
// result: "I am name(matched) and I am age(matched) years old"

しかし、最初のスニペットは効果的です:

document.write(string.replace(/{([\s\S]+?)}/g,""));

(person['$1']||"")そのまま渡せる値ではないからです。これは、最初に評価されるプロパティ ルックアップおよび論理和であり、その結果""の値 -- -- が実際に に渡されreplaceます。

一致した後に式を評価できるようにするには、2 番目のスニペットにあるように、関数を使用して評価を遅らせる必要があります。

于 2012-07-02T20:25:31.583 に答える
1

それは私には理にかなっています。つまり、これを見れば意味があります。

person['$1']

あなたは基本的に「$1中のオブジェクトをください」と言っていますpersonが、この場合はundefined. 正規表現キャプチャ グループの前にオブジェクトを評価しようとしていると思います。そのため、この状況では、関数の置換があり、機能します。

于 2012-07-02T20:26:24.940 に答える
1

RegExp.replace$nメソッドは、文字列内でのみ式 ($&およびその他のいくつか -完全なリストについてはこちらを参照)を解析しようとします。しかし、のようなものperson['$1']は文字列ではありません-文字列に評価される可能性がある(または評価されない可能性がある)式です。この評価の後でのみ、後方参照「マーカー」が解析されます。

あなたのケースでは、コールバックreplaceが唯一の通常の方法だと思います。

于 2012-07-02T20:28:56.260 に答える
0

2 番目の正規表現では、$1 を一重引用符で囲みません。

于 2012-07-02T20:18:29.247 に答える