我正在尝试解析一个文件,并捕获所有的“发送”日期。日期的格式会有所不同,所以我正在寻找模式并添加格式(以提供给Time::Piece::strptime )。我的日期模式如下:"Mon Nov 13 12:34:10 2006“或"Tuesday,11.14,2006 10:58 AM”。我使用了一个前瞻性断言来查看end是AM还是PM,并处理了我逐行读取文件并编写以下代码的两种情况:
print "$2<-\n" if $line =~ /(Sent):\s*([^\n]+)(?<=AM|PM)$/;
print "$2<- \n" if $line =~ /(Sent):\s*([^\n]+)(?<!AM|PM)$/; 我遇到的问题是,有时我在换行符之前的行尾有一个空格。例如“2006年11月14日星期二上午10:58”或"Mon Nov 13 12:34:10 2006“。我不知道如何写展望,看看是否有一个AM或PM,然后在结尾有一个可能的空格。结果是两次都匹配。我知道我可以打破循环(在匹配时放置适当的块,然后在匹配第一个块时使用"next“),但我真的想了解正则表达式引擎在做什么。另外,为什么$2包含AM和PM?谢谢
发布于 2019-12-25 11:59:24
if ( my ($sent) = $line =~ /Sent:\s*(.*)/ ) {
print "= $sent\n" if $sent =~ /[AP]M\s*$/;
print "! $sent\n" if $sent !~ /[AP]M\s*$/;
}发布于 2019-12-25 12:20:38
下面的代码能正确提取日期吗?
use strict;
use warnings;
use feature 'say';
my $pattern = qr/Sent:\s+(.*?)\s*$/;
my $date;
while( <DATA> ) {
next if /^$/;
$date = undef;
$date = $1 if /$pattern/;
say "[$date]" if $date;
}
__DATA__
Sent: Mon Nov 13 12:34:10 2006
Sent: Fri Apr 13 12:34:10 2007
Sent: Sat Jun 13 12:34:10 2009
Some extra line to skip
Sent: Tuesday, November 14, 2006 10:58 AM
Sent: Monday, November 16, 2006 6:20 AM
Sent: Thursday, November 17, 2006 8:18 PM
Other extra line to skip
Sent: Wednesday, December 4, 2006 1:06 PM 输出
[Mon Nov 13 12:34:10 2006]
[Fri Apr 13 12:34:10 2007]
[Sat Jun 13 12:34:10 2009]
[Tuesday, November 14, 2006 10:58 AM]
[Monday, November 16, 2006 6:20 AM]
[Thursday, November 17, 2006 8:18 PM]
[Wednesday, December 4, 2006 1:06 PM]https://stackoverflow.com/questions/59473812
复制相似问题