JavaScript正则表达式优先规则

时间:2013-03-05 08:56:36

标签: javascript regex

这是如何运作的?

代码:

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}会有匹配。

1 个答案:

答案 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的回调中似乎更简单。您选择的标识符replacereplaces涉及replace方法调用,format作为函数及其参数之一,使代码难以阅读。< / p>