有人可以解释这个正则表达式片段吗?

Can Someone Explain this regex snippet?

本文关键字:正则表达式 片段 解释      更新时间:2023-09-26

我发现这用看起来像正则表达式的代码替换了代码,但我无法破译

new Date().toISOString().
  replace(/[z|t|'.]/gim," ").
  replace(/'d{3}'s$/gim, " ").
  replace(/:'d{2}'s+$/, " ").
  trim() + "'n")

对不起,如果这很模糊。我不太确定我在看什么

代码

new Date().toISOString()

生成如下所示的内容

2015-07-01T17:21:22.123Z

正则表达式会将其放入格式

2015-07-01 17:21

所有的正则表达式都有标志gmi。直接从正则表达式101,这意味着:

g 修饰符:全局。所有匹配项(第一场比赛时不返回(

i 修饰符:不敏感。不区分大小写的匹配(忽略 [a-zA-Z] 的大小写(

m 修饰符:多行。导致 ^ 和 $ 匹配每行的开头/结尾(不仅是字符串的开始/结尾(

第一个正则表达式

[z|t|'.]

实际上已经有一个错误了。写它的人假设|意味着or但方括号内的情况并非如此。可以更好地写成

[zt'.]

这将匹配 2015-07-01 T 17:21:22 . 123 Z然后替换

replace(/[z|t|'.]/gim," ")

将用空格替换与该正则表达式匹配的每个字符。为您提供新字符串

2015-07-01 17:21:22 123

下一个正则表达式'd{3}'s$匹配并替换 2015-07-01 17:21:22 123 ,为您提供:

2015-07-01 17:21:22

最后正则表达式:'d{2}'s+$匹配并替换 2015-07-01 17:21 :22 , 给你

2015-07-01 17:21

然后修剪掉多余的空格。

总而言之,这不是做你想做的事的好方法。你可以用子字符串或 momentjs 做得更好,正如其他人已经说过的那样。

ISO 字符串日期以如下格式打印日期:

2015-07-01T17:20:52.214Z

/[z|t|'.]/ - 似乎是[zt.]的错误类型 - 替换所有"z","t"或"."字符。 g是全局的,i不区分大小写,m是多行的(在这里没有用,因为 ISO 日期只有一行(。 这适用于所有正则表达式。

这将替换时间之前的T,最后一个Z与空格以及214之前的.

/'d{3}'s$/ -- 3 位数字后跟一个锚定在行尾的空格。 这将替换从上一个替换中添加的214和空间。

/:'d{2}'s+$/ -- 冒号后跟两位数字,后跟一个或多个锚定在行尾的空格。 这将替换:52(秒部分(以及先前更换件在末尾添加的空间。

.trim删除最终替换添加到末尾的空格。 你最终会得到:

2015-07-01 17:20

。或当前年-月-日 24 小时:分钟

这很好,但可能不需要多次替换。 如果您需要做很多日期格式化,我会推荐 momentjs 库,它使这种事情变得非常容易。 您也可以从其他日期方法(如 .getMonth .

一个更易读的方法是:

var date = new Date().toISOString();
date = date.substr(0, 10) + ' ' + date.substr(11, 8);
不知道

原因,但可以解释替换的作用

  .replace(/[z|t|'.]/gim," ")  // replace with space any z,t or . 
                               // case insenzitive multiline
  .replace(/'d{3}'s$/gim, " ") // replace with space a group of 
                               // 3digits followed by 1 space at the 
                               // end of string
  .replace(/:'d{2}'s+$/, " ")  // replace the group of :, 2 digits 
                               // and at least 1 space from the tail 
                               // of string with space