Regex 使用PERL正则表达式获取时间戳
我很难找到一个日期、月份和年份之间用点分隔的时间戳,尽管我选择的正则表达式在匹配只完成一次时似乎工作得很好 这是我的文字行:Regex 使用PERL正则表达式获取时间戳,regex,perl,timestamp,Regex,Perl,Timestamp,我很难找到一个日期、月份和年份之间用点分隔的时间戳,尽管我选择的正则表达式在匹配只完成一次时似乎工作得很好 这是我的文字行: TIMESTAMP: 08.08.2016 00:33:01 代码如下: #!/usr/bin/perl -w #looking for timestamp in the following format: TIMESTAMP: 08.08.2016 00:33:01 my $TIMESTAMP; my $TXT; $TXT = "TIMESTAMP:
TIMESTAMP: 08.08.2016 00:33:01
代码如下:
#!/usr/bin/perl -w
#looking for timestamp in the following format: TIMESTAMP: 08.08.2016 00:33:01
my $TIMESTAMP;
my $TXT;
$TXT = "TIMESTAMP: 08.08.2016 00:33:01";
#matching for MACRO. example: TIMESTAMP: 2016-09-18T15:07:20.246Z
($TIMESTAMP = $TXT) =~ /^TIMESTAMP: ([0-9]{1,4}-[0-9]{1,2}-[0-9] {1,2})T([0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}).[0-9]+Z/;
print "\ncheck1)the TIMESTAMP value is:$TIMESTAMP\n";
if (! defined $1) {
#matching for MM. example: TIMESTAMP: 08.08.2016 00:33:01
($TIMESTAMP = $TXT) =~ /^TIMESTAMP: ((?:\d+).(?:\d+).(?:\d+))\s((?:\d+):(?:\d+):(?:\d+))/;
print "check2)the TIMESTAMP value is:$TIMESTAMP\n";
}
if (defined $1 and defined $2) {
$TIMESTAMP = $1." ".$2;
print "the timestamp is:$TIMESTAMP\n";
} else {
$TIMESTAMP = "n/a\n";
print "not all elements of TIMESTAMP were defined, TIMESTAMP:$TIMESTAMP\n";
}
我曾经验证正则表达式是否有效,但当我在一行中执行两次检查时,脚本无法传递组$1
和$2
更新
整洁的Perl代码
#!/usr/bin/perl -w
# Looking for timestamp in the following format: TIMESTAMP: 08.08.2016 00:33:01
my $TIMESTAMP;
my $TXT;
$TXT = "TIMESTAMP: 08.08.2016 00:33:01";
# Matching for MACRO. example: TIMESTAMP: 2016-09-18T15:07:20.246Z
( $TIMESTAMP = $TXT ) =~ /^TIMESTAMP: ([0-9]{1,4}-[0-9]{1,2}-[0-9] {1,2})T([0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}).[0-9]+Z/;
print "\ncheck1) the TIMESTAMP value is:$TIMESTAMP\n";
if ( ! defined $1 ) {
# matching for MM. example: TIMESTAMP: 08.08.2016 00:33:01
( $TIMESTAMP = $TXT ) =~ /^TIMESTAMP: ((?:\d+).(?:\d+).(?:\d+))\s((?:\d+):(?:\d+):(?:\d+))/;
print "check2)the TIMESTAMP value is:$TIMESTAMP\n";
}
if ( defined $1 and defined $2 ) {
$TIMESTAMP = $1 . " " . $2;
print "the timestamp is:$TIMESTAMP\n";
}
else {
$TIMESTAMP = "n/a\n";
print "not all elements of TIMESTAMP were defined, TIMESTAMP:$TIMESTAMP\n";
}
您的代码运行良好,但您使其过于复杂
- 你的评论是错误的,甚至彼此都不同意
- 在
(?:…)
- 必须在正则表达式模式中转义文字点
,否则它可以匹配任何字符 - 最好将
修饰符与一个不平凡的正则表达式模式一起使用,这样就可以添加空格,使其更具可读性/x
- 捕获变量
,$1
。。。是块范围的,但您希望它们是永久的$2
Data::Dump
在代码中的几个点显示捕获的值
#/usr/bin/perl
严格使用;
使用“全部”警告;
使用数据::转储;
my$text=“时间戳:08.08.2016 00:33:01”;
除非(定义为1美元){
$text=~/^TIMESTAMP:\s*(\d+\.\d+\.\d+)\s+(\d+:\d+:\d+)/x;
dd[$1,$2];
}
dd[$1,$2];
输出
[“08.08.2016”,“00:33:01”]
[未定义,未定义]
应转义模式中的文字点。另外,(?:\d+)
=\d+
。试试Thank Wiktor,注意我执行了两个检查,第一个是时间戳,其中一个连字符用于分隔日、月、年。如果没有找到该模式,那么我会检查是否有点(.)作为分隔符……但无论我使用了什么正则表达式(您的或我的),它都无法拾取$1和$2。您的Perl代码很难读取。你能不能不使用空格来添加布局并使其更具可读性?谢谢,我会记住的。