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

时间:2010-12-21 14:12:04

标签: regex perl timestamp

我想接受这个

Code:
2010-12-21 20:00:00

并使它看起来像这样:

Code:
20101221200000

这是我尝试的最后一件事

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";
    }

它产生了这个:

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$

-Thanks

4 个答案:

答案 0 :(得分:6)

首先,这是代码的问题:

$teststring =~ "/(d\{4\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})/$result";

您希望=~与替换运算符s///一起使用。也就是说,右侧不应该是普通字符串,而是s/pattern/replacement/

在模式部分中,\d表示一个数字。但是,\d包括Unicode数字类中的所有排序字符,因此如果要匹配的话,使用字符类[0-9]会更安全。 [0-9]{4}表示匹配字符09四次。请注意,您不应该忽略大括号{}

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

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

下面,我使用/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

或者,使用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

答案 1 :(得分:5)

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

$ perl -e '$_ = "2010-12-21 20:00:00"; s/[\D]//g; print $_;'
20101221200000

答案 2 :(得分:0)

你能不能删除任何不是数字的东西?

s/[^\d]//g 
以sed格式,不记得perl。

答案 3 :(得分:0)

($result = $teststring) =~ y/0-9//cd;