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代码很难读取。你能不能不使用空格来添加布局并使其更具可读性?谢谢,我会记住的。