2

次のコードではalert(a)、JavaScriptのreplace関数の内部で、一致した文字列(この場合は{name}と{place})に警告が表示されます。

これは、ドキュメントjavascript docsで説明されているように機能します。つまり、replaceメソッドの関数の最初の引数は、一致した文字列になります。以下のコードでは、alert(b)は「名前」と「場所」を警告しますが、それらの周りに中括弧はありません。

何故ですか?'b'の中括弧をどのように削除しますか?これがフィドル ですhttp://jsfiddle.net/mjmitche/KeHdU/

さらに、ドキュメントからこの例を見ると、

function replacer(match, p1, p2, p3, offset, string){
  // p1 is nondigits, p2 digits, and p3 non-alphanumerics
  return [p1, p2, p3].join(' - ');
};

この例のどのパラメーターが、以下の置換関数のfunction(a、b)の「b」を表しますか?

私の理解の失敗の一部は、たとえば、最大数の引数が使用されていない場合に2番目のパラメーターでjavascriptが何をするのかわからないという事実が原因である可能性があります。

コード

var subObject = {
    name:  "world",
    place: "google"

}; 

var text = 'Hello, {name} welcome to {place}';


var replace = function (s, o) {
            return s.replace(/\{([^{}]*)\}/g,
              function (a, b) {
                  alert(a);
                  alert(b);
                var r = o[b];

                return typeof r === 'string' || typeof r === 'number' ? r : a;
              }
            );
}; 

var replacedText = replace(text, subObject); 
alert(replacedText); ​
4

3 に答える 3

1

最初のパラメーターは、正規表現に一致する文字列全体です(グループのキャプチャーは重要ではないため、になります{name})。

2番目、3番目、4番目などのパラメーターはキャプチャーグループであり、1つしかないため、2番目の引数はになりnameます。

最後の2つのパラメーターは、一致の位置と文字列全体です。必要に応じて、コールバックからこれらの引数を省略できます。

置換オブジェクトに存在しない属性を説明する、もう少し読みやすいバージョンのコードを次に示します。

var replace = function(string, object) {
    return string.replace(/\{(.*?)\}/g, function(match, group) {
        return group in object ? object[group] : match;
    });
};

デモ: http: //jsfiddle.net/KeHdU/4/

于 2012-12-08T23:40:15.273 に答える
0

最大数の引数が使用されていない場合、それらは無視されます。ただし、関数内の引数が参照され、最初に!undefinedがテストされていない場合、スクリプトはエラーになります。

于 2012-12-08T23:46:29.500 に答える
0

置換関数の使用方法については、https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replaceを参照してください。

function replacer(match, p1, p2, p3, offset, string){
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics
    return [p1, p2, p3].join(' - ');
};

match:一致した部分文字列全体(つまり、正規表現に一致したもの)です

p1、p2 .... pn:are The nth parenthesized submatch string(一致したサブストリング内)

オフセット:元の文字列のオフセット

文字列:入力文字列

あなたの場合、あなたは完全な議論を提供しませんでした

s.replace(a, b /*, offset, string*/)

そうa=matchb=p1

**最初のパラメーターの正規表現がグローバルである場合、置換される完全一致ごとに関数が複数回呼び出されることに注意してください。

したがって、各一致はで始まり、{で終わり}、中括弧内のコンテンツに一致する1つのキャプチャ括弧があります。また、グローバルマッチを使用しているため/ {([^ {}] *)}/g

したがって、この関数は、次のパラメーターを使用した2つの一致で2回呼び出されます。

  1. '{name}'、'name'、7、'こんにちは、{name}は{place}へようこそ '
  2. '{place}'、'place'、25、'こんにちは、{name}{place}へようこそ'

一致全体(つまり、最初のパラメーター)が関数の戻り値に置き換えられます

于 2012-12-09T00:03:29.230 に答える