如何让 padStart 正确处理正则的分组标志如 $1 ?

发布于 2022-09-11 17:36:03 字数 513 浏览 13 评论 0

在下面代码里,我想把"p"后面的数字补全到 3 位,但是我发现不管 p 后面是多少位,总是会在前面补齐一个 0。

var a='18917304_p1234';
a.replace(/(\d.*p)(\d.*)/,'$1'+('$2'.padStart(3, '0')));
// "18917304_p01234"

经过我的胡乱分析,可能是因为 padStart 并没有获取到 $2 的值,而是把 $2 当作了普通字符串。 $2 这两个字长度是 2,所以 padStart 总是会补齐一个 0。

后来换了种写法解决了,但是如果不改写,有更直接的办法处理这种情况吗?

a.replace(/(\d.*p)(\d.*)/,function (...str) {
    return str[1]+str[2].padStart(3, '0');
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

知你几分 2022-09-18 17:36:03

你的猜测是正确的,这只是js基本语法的问题,和replace无关:当padStart执行时,replace还没有执行,此时$2并不是一个变量

所以a.replace(/(\d.*p)(\d.*)/,'$1'+('$2'.padStart(3, '0')))

实际上就是a.replace(/(\d.*p)(\d.*)/,'$1' + '0$2'))

当然,假若你想获取$1,$2的变量,可通过执行正则后再捕获,但不如你后续补充的答案简洁,如:

var reg = /(\d.*p)(\d.*)/;
reg.exec('18917304_p1234');
var str = RegExp.$1 + RegExp.$2.padStart(3, '0');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文