【问题标题】:JS Regex: how to remove first 2 zero's from "08/08/2017"JS 正则表达式:如何从“08/08/2017”中删除前 2 个零
【发布时间】:2017-08-09 05:04:15
【问题描述】:

我是正则表达式的新手,整晚都在研究如何从“08/08/2017”之类的字符串中删除前 2 个零(不删除“2017”中的 0)

我查看的 5+ 正则表达式教程似乎没有涵盖我需要的内容。

日期可以是系统返回的任何 sysdate。所以正则表达式也需要为“12/12/2017”工作

这是我想出的最好的:

let sysdate = "08/08/2017"
let todayminuszero = str.replace("0","");
let today = todayminus0.replace("0","");

有效,但显然不专业。

从教程中,我很确定我可以按照以下方式做一些事情: str.replace(/\d{2}//g,""),); 这种模式将避免在 str 中获得第三个零。 替换字符串必须指示 8/8/ 不过不知道怎么写。

【问题讨论】:

  • 为什么不在年月日拆分它,并为您需要的任何部分替换前导零。我认为您的代码将在“2017 年 10 月 10 日”

标签: javascript node.js regex regex-group


【解决方案1】:

对于日期操作,我会使用其他功能(最好的日期相关)但是,对于您所说的情况,这应该这样做。如果您需要其他格式,我建议您以不同的方式删除零,但这完全取决于您的 UseCase。

let sysdate = "08/08/2017";
let todayminuszero = sysdate.replace(/0(?=\d\/)/gi,"");
console.info(todayminuszero);

(?= ... ) 被称为 Lookahead,通过它您可以看到那里有什么,而无需替换它
在这种情况下,我们正在检查一个数字和一个斜杠。 (?=\d\/) 这里有更多信息,如果你想了解前瞻和更多信息 http://www.regular-expressions.info/lookaround.html

测试正则表达式的好地方是 https://regex101.com/ 我总是将它用于更高级的表达式,因为它显示了所有匹配的组等,并提供了很好的解释。很好的资源/帮助,如果您正在学习或创建困难的表达式。

信息: 如 Rajesh 所述,此表达式不需要 i 标志,我只是出于个人喜好使用它。此标志只是将表达式匹配设置为不区分大小写。

 

-- 超出范围,但可能很有趣--

没有正则表达式的更长解决方案可能如下所示:

let sysdate = "08/08/2017";
let todayminuszero = sysdate.split("/").map(x => parseInt(x)).join("/");

console.info(todayminuszero);

背面,这个解决方案有很多活动部分,split 函数可以创建一个数组(´"08/08/2017"´ to ´["08", "08", "2017"]´), map 函数,带有 lambda 函数 => 和 parseInt 函数,从每个字符串项中生成一个很好的整数(例如:"08" 到 8,...),最后是 @987654333 @ 从新创建的整数数组中创建最终字符串的函数。

【讨论】:

  • 如果您正在处理 dateString,那么有 i 标志有什么意义?
  • 你不需要它,但我个人总是设置这两个标志,如果表达式明确不需要它,则删除它们。这只是我的个人风格。
  • @TomLord 你是指i 标志还是演示代码?我总是乐于改进。现在我正在写这篇文章,看到一些缺少的分号。
  • 顺便说一句。我通常不喜欢链接,但这似乎是“趋势”。 (但至少我没有缩进);-)
  • 我的意思是“默认”传递i 标志,即使不需要它也是如此。默认情况下会关闭区分大小写,原因很充分:它可以防止意外匹配,并(略微)提高性能。
【解决方案2】:

你应该使用这个

let sysdate = "08/08/2017"
let todayminuszero = sysdate.replace(/(^|\/)0/g,"$1");
console.log(todayminuszero);

【讨论】:

  • 或sysdate.replace(/\b0/g,"")
【解决方案3】:

function stripLeadingZerosDate(dateStr){
    return dateStr.split('/').reduce(function(date, datePart){
        return date += parseInt(datePart) + '/'
    }, '').slice(0, -1);
}

console.log(stripLeadingZerosDate('01/02/2016'));
console.log(stripLeadingZerosDate('2016/02/01'));

看这里

function stripLeadingZerosDate(dateStr){
return dateStr.split('/').reduce(function(date, datePart){
    return date += parseInt(datePart) + '/'
}, '').slice(0, -1);

}

console.log(stripLeadingZerosDate('01/02/2016'));// 1/2/2016
console.log(stripLeadingZerosDate('2016/02/01'));// "2016/2/1"

【讨论】:

  • OP 使用/ 作为分隔符。我建议使用正则表达式拆分/[\/-]/
【解决方案4】:

前 2 个零,我知道您的意思是在月份和日期中 8 之前的零。

你可以试试这样的:

想法

  • 创建一个正则表达式,用于捕获代表日期、月份和年份的数字组。
  • 使用此正则表达式替换值。
  • 使用函数返回处理后的值。

var sysdate = "08/08/2017"
var numRegex = /(\d)+/g;

var result = sysdate.replace(numRegex, function(match){
  return parseInt(match)
});
console.log(result)

【讨论】:

  • @downvoter,请随意强调错误。这将对每个人都有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2018-02-17
相关资源
最近更新 更多