这是如何运作的?
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}
会有匹配。
答案 0 :(得分:0)
([d]+)
或(d+)
只会贪婪地匹配并捕获一个或多个"d"
。
([d]+)?
或(d*)
只会贪婪地匹配并捕获零个或多个"d"
。
对于 lazy 匹配,需要在量词之后立即添加?
,即d+?
,但此处不需要d+\}
和d+?\}
}
将始终进行完全相同的匹配,d
匹配所有"ddde"
之前需要匹配。
只有当有关于哪些特定字符可以匹配的选项时,懒惰才有意义。例如,匹配字符串d+.
时,d+?.
将匹配整个字符串,而dd
只匹配.
,因为d
可以匹配第二个字符{ {1}}。
您说您希望&#34;确保始终在{xxx}
&#34;之前始终处理{xx}
之前始终处理{x}
,但是无论匹配是否是懒惰,字符串都是首先匹配的字符串。我无论如何都不知道它在这里会有什么影响 - 或许你可以进一步解释为什么会出现问题。
从您的代码中不清楚为什么使用replaces
对象时只是将其功能包含在replace
的回调中似乎更简单。您选择的标识符replace
和replaces
涉及replace
方法调用,format
作为函数及其参数之一,使代码难以阅读。< / p>