javascript - string.replace() 正则有个奇怪的问题。

 和老师一起喝咖啡_171 发布于 2022-11-17 08:31
// ??? 这样写会发生错误
fmt = fmt.replace(/(Y+)/g, date.getFullYear().toString().substr(-RegExp.$1.length));

完整代码:

'use strict';

function formatDate(date,fmt) {

    if(!(date instanceof Date)) {
        fmt = date;
        date = new Date();
    }

    // fmt = fmt.replace(/(Y+)/g, function() {
    //     return date.getFullYear().toString().substr(-RegExp.$1.length);
    // });

    // ??? 这样写会发生错误
    fmt = fmt.replace(/(Y+)/g, date.getFullYear().toString().substr(-RegExp.$1.length));

    fmt = fmt.replace(/(M+)/g, date.getMonth() + 1);
    fmt = fmt.replace(/(D+)/g, date.getDate());
    fmt = fmt.replace(/(h+)/g, date.getHours());
    fmt = fmt.replace(/(m+)/g, date.getMinutes());
    fmt = fmt.replace(/(s+)/g, date.getSeconds());
    fmt = fmt.replace(/(q+)/g, Math.floor((date.getMonth() + 3)/3));
    fmt = fmt.replace(/(S+)/g, date.getMilliseconds());

    return fmt;
}

console.log(formatDate('YY-M-D h-m-s S-Q'));
3 个回答
  • 好着呢,我这边没报错,只是q是不是应该大写。

    fmt = fmt.replace(/(Q+)/g, Math.floor((date.getMonth() + 3)/3));
    2022-11-17 09:58 回答
  • `

    var fmt = 'YY-M-D h-m-s S-Q';
    fmt = fmt.replace(/(Y+)/g, function(all, year) {
        return (new Date).getFullYear().toString().substr(-year.length);
    });

    `

    2022-11-17 09:58 回答
  • Regexp 本身就是浏览器环境提供的一个接口,他返回一个正则对象,这个对象的属性$1值为空字符串。
    所以你才会得到这样的返回值。
    建议这样写:

        var fmt = 'YY-M-D h-m-s S-Q';
        fmt = fmt.replace(/(Y+)/g, function() {
            return (new Date).getFullYear().toString().substr(-RegExp.$1.length);
        });
        console.log(fmt);

    replace的函数参数的默认参数分别是:

    正则表达式匹配结果和分组捕获结果

    这样在回调函数中就可以使用$1来获取第一个匹配分组。

    2022-11-17 09:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有