使用Perl正则表达式重新排列时间戳

Geo*_*pty 6 regex perl

我想用尽可能少的代码重新安排带有Perl正则表达式的时间戳.时间戳的原始格式如下:

2011/12/29 20:19:45
Run Code Online (Sandbox Code Playgroud)

我需要做的就是将它转换为前面的年份而不是在月份/日期之后,如下所示:

12/29/2011 20:19:45
Run Code Online (Sandbox Code Playgroud)

我能够通过下面的3行代码实现这一目标.我只是想知道是否有办法用更少的代码来做到这一点.特别是我试图取消将$ 1保存到中间变量的中间行,并在正则表达式中直接指定$ 1进行第二次替换,但这导致错误:"在连接中使用未初始化的值$ 1( .)或字符串."

如果第二行无法摆脱,那么看起来这也不能归结为一行?

#my $ts = '2011/12/29 20:19:45'; #input to a subroutine

$ts =~ s/^(\d{4})\///;
my $year = $1;
$ts =~ s/ /\/$year /;
Run Code Online (Sandbox Code Playgroud)

Igo*_*hov 5

你走了:

$ts =~ s|^(\d{4})/(\d{2})/(\d{2})(.+)$|$2/$3/$1$4|;
Run Code Online (Sandbox Code Playgroud)

请注意,上面的表达式要求时间戳的月份和日期恰好为 2位数,而年份则为4位数.但是你可以让它更短但更可靠:

$ts =~ s|^(\d+)/(\d+)/(\d+)(.+)$|$2/$3/$1$4|;
Run Code Online (Sandbox Code Playgroud)

这个将适当地处理时间戳,如1/12/98 12:34:56.

  • 无需捕获字符串的其余部分.如果您没有指定要更改,则不会.更短的是`s |(\ d {4})/(\ d +)/(\ d +)| $ 2/$ 3/$ 1 |;` (3认同)