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)
-谢谢
首先,这是您的代码的问题:
$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)
使用正则表达式将所有非数字([^\d]或[\D])替换为空字符串:
$ perl -e '$_ = "2010-12-21 20:00:00"; s/[\D]//g; print $_;'
20101221200000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1232 次 |
| 最近记录: |