从字符串中捕获时间

时间:2014-05-11 21:14:34

标签: regex perl

我想从文件txt捕获小时数。例如:

在档案中有一些文章。我想花几个小时:

11:51
00:32

但我不能13:5111:61。我目前的代码不起作用。

while ($word = <$fh>) {
    if ($word =~ /\d\d:\d\d/) {
        print $word . "\n";
    }
}

4 个答案:

答案 0 :(得分:2)

不要把正则表达像拐杖一样对待。如果你这样做,你会落入XY Problem土地。

如果您可以使用简单的if语句验证捕获,那么请执行此操作。不要挂断一种解决方法:

use strict;
use warnings;

while (my $line = <DATA>) {
    while ($line =~ /\b(\d\d:\d\d)\b/g) {
        my $time = $1;
        my ($hour, $min) = split ':', $time;
        if ($hour < 13 && $min < 60) {
            print "Time = $time\n"
        }
    }
}

__DATA__
11:51
00:32
13:51
11:61

输出:

Time = 11:51
Time = 00:32

答案 1 :(得分:1)

如果你有AM / PM格式的时间且不能超过12:00,那么你需要使用数值范围:

/(?:0[1-9]|1[0-2]):[0-5]\d/

(?:0[1-9]|1[0-2])将匹配0[1-9](01-09)或1[0-2](10-12)。

[0-5]\d将匹配00-59。

答案 2 :(得分:0)

如果你想匹配小时,但只能看起来像你的样本。

^\d\d?(?=:\d\d?$)

如果小时和分钟始终为2位数,请删除问号。

答案 3 :(得分:0)

当然perl文档perlretut是标准参考,但是为了阅读和尝试,你可能会看Regexp::Debugger,它安装了一个很好的命令行正则表达式编辑器和分析工具{{ 1}}。它非常简单,但在了解正则表达式引擎的工作原理方面非常有用。

如果您打开安装CPAN模块,您将从rxrx命名空间获得大量帮助(在您的情况下Regexp::Common::time可能有用)。 Regexp::Common模块简化了&#34;标准化&#34;常见类别的正则表达式。最好的部分是,如果您处于CPAN模块不可用的情况,您可以阅读源代码以了解如何自己完成。

这里是@ Miller&#39;示例使用Regexp::Common:: ...

Regexp::Common::time

请注意,这将按原样打印 #!/usr/bin/env perl5 use strict; use warnings; use Regexp::Common qw(time); while (my $line = <DATA>) { if ($line =~ $RE{time}{hms}{-keep}) { print "Time = $2:$3 \n"; } } __DATA__ 11:51 00:32 13:51 11:61 值(此处在加拿大3几乎是咖啡时间)。有关如何使用13:51兼容格式限制时间模式,请参阅POD。它也可以使用模块并以正常strftime方式摆弄输出(例如perl)。

@ Miller的方法是最简单的(+1来自我),但print "Time = $2:$3 \n" unless $2 > 12;是一个非常有用的工具。

干杯,