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

我使用+来识别一个或多个字符是否正确?

当我扩展替换功能时,这里有什么陷阱吗?{xx}我主要担心之前会有一场比赛{xxx}

4

1 回答 1

0

([d]+)或者只是(d+),会贪婪地匹配并捕获一个或多个"d"

([d]+)?,或者只是(d*),会贪婪地匹配并捕获零个或多个"d"

对于惰性匹配,?需要在量词 ie 之后立即添加d+?,但这里不需要它,d+\}并且d+?\}将始终进行完全相同的匹配,因为}要匹配所有ds 之前需要匹配它。

只有当存在可以匹配哪些特定字符的选项时,惰性才有意义。例如,当匹配 string 时"ddde", thend+.将匹配整个 string 并且d+?.会匹配,dd因为 the.可以匹配第二个d

你说你想“确保{xxx}总是在之前{xx}处理总是在之前处理{x}”,但是字符串中较早的那个是首先匹配的那个,无论匹配是否是惰性的。无论如何,我不明白这有什么关系 - 也许你可以进一步解释为什么这会是一个问题。

从您的代码中不清楚为什么要使用一个replaces对象,而将其功能包含在回调中似乎更简单replace。您选择的标识符,replace涉及replaces方法replace调用,以及format作为函数及其参数之一,使代码难以阅读。

于 2013-03-05T11:06:16.337 回答