0

これはどのように作動しますか?

コード:

a = {
    replacers: {
        YYYY: function () {
            return this.getFullYear();
        },
        dd: function () {
            var me = this,
                day = me.getDate();

            return (day < 10 ? '0' : '') + day;
        },
        d: function () {
            var me = this;

            return me.getDate();
        }
    },
    format: function (date, format) {
        var replacers = a.replacers;

        // I just added a plus to get multiple digits and it works...
        return format.replace(/\{([Yd]+)\}/g, function (str, p1) {
            var formatter = replacers[p1];
            if (formatter)
                return formatter.call(date);
        });
    }
};

document.write(a.format(new Date(), '{dd} {d} {YYYY} {d} {dd}'));

結果:

05 5 2013 5 05

+を使用して1つ以上の文字を識別するのは正しいですか?

置換機能を拡張する際の落とし穴はありますか?私は主に{xx}前に試合があるのではないかと心配してい{xxx}ます。

4

1 に答える 1

0

([d]+)、または単に(d+)、1つ以上を貪欲に一致させてキャプチャします"d"

([d]+)?、または単に(d*)、は貪欲に一致し、0個以上をキャプチャします"d"

レイジーマッチングの場合?、数量詞の直後に追加する必要がd+?あります。つまり、ここでは必要ありませんd+\}。これは、一致する必要がある前にすべてのsを一致させるd+?\}ため、常にまったく同じ一致を行います。}d

怠惰は、特定の文字を一致させることができるオプションがある場合にのみ関連します。たとえば、文字列と一致する場合、は文字列"ddde"全体d+.と一致し、が2番目のと一致する可能性があるという理由d+?.だけで一致します。dd.d

「常に{xxx}前に処理されることを確認する」と言いますが、文字列の前にあるものは、一致が遅延しているかどうかに関係なく、最初に一致するものです。とにかくここでそれがどのように重要になるかはわかりません-おそらくそれが問題になる理由をさらに説明することができます。{xx}{x}

replacesへのコールバック内にその機能を含めるだけの方が簡単に思えるのに、なぜオブジェクトを使用しているのかはコードからは明らかではありませんreplace。また、識別子を選択し、メソッド呼び出しreplacereplaces含み、関数とそのパラメーターの1つとして、コードを読みにくくします。replaceformat

于 2013-03-05T11:06:16.337 に答える