我想从文件txt捕获小时数。例如:
在档案中有一些文章。我想花几个小时:
11:51
00:32
但我不能13:51
或11:61
。我目前的代码不起作用。
while ($word = <$fh>) {
if ($word =~ /\d\d:\d\d/) {
print $word . "\n";
}
}
答案 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;
是一个非常有用的工具。
干杯,