首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REGEX匹配-前瞻断言

REGEX匹配-前瞻断言
EN

Stack Overflow用户
提问于 2019-12-25 06:22:17
回答 2查看 50关注 0票数 0

我正在尝试解析一个文件,并捕获所有的“发送”日期。日期的格式会有所不同,所以我正在寻找模式并添加格式(以提供给Time::Piece::strptime )。我的日期模式如下:"Mon Nov 13 12:34:10 2006“或"Tuesday,11.14,2006 10:58 AM”。我使用了一个前瞻性断言来查看end是AM还是PM,并处理了我逐行读取文件并编写以下代码的两种情况:

代码语言:javascript
复制
    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?谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-12-25 11:59:24

代码语言:javascript
复制
if ( my ($sent) = $line =~ /Sent:\s*(.*)/ ) {
   print "= $sent\n" if $sent =~ /[AP]M\s*$/;
   print "! $sent\n" if $sent !~ /[AP]M\s*$/;
}
票数 1
EN

Stack Overflow用户

发布于 2019-12-25 12:20:38

下面的代码能正确提取日期吗?

代码语言:javascript
复制
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 

输出

代码语言:javascript
复制
[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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59473812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档