从日期/时间字符串中删除分隔符

Nat*_*oob 3 regex perl timestamp

我想接受这个

Code:
2010-12-21 20:00:00
Run Code Online (Sandbox Code Playgroud)

并使它看起来像这样:

Code:
20101221200000
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的最后一件事

Code:
#!/usr/bin/perl  -w
use strict;
my ($teststring) = '2010-12-21 20:00:00';
my $result =  " ";
print "$teststring\n";
$teststring =~ "/(d\{4\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})/$result";
        { 
    print "$_\n";
    print "$result\n";
        print "$teststring\n";
    }
Run Code Online (Sandbox Code Playgroud)

它产生了这个:

Code:
nathan@debian:~/Desktop$ ./ptest
2010-12-21 20:00:00
Use of uninitialized value $_ in concatenation (.) or string at ./ptest line 8.


2010-12-21 20:00:00
nathan@debian:~/Desktop$
Run Code Online (Sandbox Code Playgroud)

-谢谢

Sin*_*nür 6

首先,这是您的代码的问题:

$teststring =~ "/(d\{4\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})/$result";
Run Code Online (Sandbox Code Playgroud)

您想要使用=~替换运算符s///.也就是说,右手边不应该是一个普通的字符串,而是s/pattern/replacement/.

在模式部分中,\d将表示数字.但是,\d包括Unicode数字类中的所有排序字符,因此[0-9]如果要匹配,则使用字符类会更安全.[0-9]{4}将意味着匹配字符0通过9四次.请注意,您不应该转义大括号{}.

括号()定义捕获组.在替换部分中,您希望保留捕获的内容,并忽略您没有捕获的内容.

另外,我假设这些时间戳出现在其他输入中,并且你不想意外地替换你不想要的东西(通过盲目删除所有非数字).

下面,我使用操作符的/x修饰符,s///因此我可以pattern使用空格更清晰地格式化.

#!/usr/bin/perl

use strict; use warnings;

while ( <DATA> ) {
    s{
        ^
        ([0-9]{4})-
        ([0-9]{2})-
        ([0-9]{2})[ ]
        ([0-9]{2}):
        ([0-9]{2}):
        ([0-9]{2})
    }{$1$2$3$4$5$6}x;
    print;
}

__DATA__
Code:
2010-12-21 20:00:00
Run Code Online (Sandbox Code Playgroud)

或者,使用引入的命名捕获组5.10可以使整个事物更具可读性:

#!/usr/bin/perl

use 5.010;

while ( <DATA> ) {
    s{
        ^
        ( ?<year>  [0-9]{4} ) -
        ( ?<month> [0-9]{2} ) -
        ( ?<day>   [0-9]{2} ) [ ]
        ( ?<hour>  [0-9]{2} ) :
        ( ?<min>   [0-9]{2} ) :
        ( ?<sec>   [0-9]{2} )
    }
    {
        local $";
        "@+{qw(year month day hour min sec)}"
    }ex;
    print;
}

__DATA__
Code:
2010-12-21 20:00:00
Run Code Online (Sandbox Code Playgroud)


mar*_*cog 5

使用正则表达式将所有非数字([^\d][\D])替换为空字符串:

$ perl -e '$_ = "2010-12-21 20:00:00"; s/[\D]//g; print $_;'
20101221200000
Run Code Online (Sandbox Code Playgroud)