【问题标题】:Adding zero to non leaded zero datetime string regex将零添加到非前导零日期时间字符串正则表达式
【发布时间】:2020-04-10 21:10:53
【问题描述】:

我有以下日期时间字符串 2020-5-1 1:2 我使用模式 (\W)(\d{1}) 匹配长度为 1 的任何数字,即非零前导 5,1,1,2This demo 表明该模式在每场比赛中都成功地在第 2 组中抓住了他们。

使用 Javascript 的 String replace 方法,我尝试将日期时间示例字符串转换为 2020-05-01 01:02。在 this jsbin 中运行以下 sn-p:

var txt = '2020-5-1 1:2'
var output = [];
output[0] = txt.replace(/(\W)(\d{1})/gi,'0$1');
output[1] = txt.replace(/(\W)(\d{1})/gi,'0$2');
console.log(output);
// The output: ["20200-0-0 0:", "202005010102"]

在第一个输出的条目中,它出现了意想不到的行为,它没有将0 添加到匹配项中,而是将其替换为0!我该如何解决这个问题?

【问题讨论】:

  • 使用.replace(/(\W)(\d)/gi,'$10$2').replace(/\b\d\b/g,'0$&'),你忘记了第二个捕获的值。
  • 顺便说一句,您也可以在同一个站点上尝试替换regex101.com/r/6NYGJG/2
  • @WiktorStribiżew 第二个正则表达式很有魅力。谢谢,但是解决方案中的\b& 是什么?如果您能在回答中说明它们,我将不胜感激。
  • $& 是对整个比赛的反向引用。 \b 是单词边界。如果您需要具体细节,请通过答案下方的评论告知。
  • 非常感谢,这是一个非常有用的答案。

标签: javascript regex replace


【解决方案1】:

您在替换模式中只使用了一个占位符,但在正则表达式模式中,您使用了两个具有两个捕获组的子字符串,因此丢失了一个。

在您可以使用的单个数字之前添加0

txt.replace(/\b\d\b/g,'0$&')
txt.replace(/(^|\D)(\d)(?!\d)/g,'$10$2')
txt.replace(/(?<!\d)\d(?!\d)/g,'0$&')     // With the ECMAScript2018+

这里,\b\d\b 匹配一个既不在 ASCII 字母、数字或 _ 之前也不在其后的数字。替换为0,整个匹配值为$&amp;

(^|\D)(\d)(?!\d) 模式将字符串或非数字字符的开头捕获到组 1,然后在组 2 中捕获一个数字。然后,(?!\d) 确保右侧没有数字。替换为 $10$2,第 1 组值,0,然后是第 2 组值。

(?&lt;!\d)\d(?!\d) 模式匹配任何未包含在其他数字中的数字,替换与案例 1 中的相同。

JS 演示:

var txt = '2020-5-1 1:2';
console.log( txt.replace(/\b\d\b/g,'0$&') )
console.log( txt.replace(/(^|\D)(\d)(?!\d)/g,'$10$2') )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多