用于前3个单独项目的Perl多行正则表达式



我正在尝试用Perl读取regex格式。有时,我看到的格式不是一行,而是三行。

对于下面的单行格式,我可以regex作为

/^s*(.*)s+([a-zA-Z0-9._]+)s+(d+)s+(.*)/

获取行中的前3个单独项目

Hi There       FirstName.LastName    10  3/23/2011 2:46 PM

下面是我看到的多行格式。我正在尝试使用类似的东西

/^s*(.*)n*n*|s+([a-zA-Z0-9._]+)s+(d+)s+(.*)$/m

获取单个项目,但似乎不起作用。

Hi There    
                         FirstName-LastName       8       7/17/2015 1:15 PM 
Testing - 12323232323 Hello There

有什么建议吗?多行正则表达式可能吗?

注:在相同的输出中,我可以看到单线或多线,或者两者都有,所以输出可以像下面一样

你好,Line1 FirstName.LastName 10 2011年3月23日下午2:46

Hello Line2

                         Line2FirstName-LastName       8       7/17/2015 1:15 PM 
Testing - 12323232323 Hello There

你好,第3行第3行名字。姓氏8 2011年3月21日下午2:46

您肯定可以在多行中应用正则表达式。

我在单词之间使用了否定的单词W+来匹配单词之间的空格和换行符(实际上W等于[^a-zA-Z0-9_](。聊天被视为一个重复的w+W+块。

如果你提供更具体的输入/输出情况,我可以完善示例代码:

#!/usr/bin/env perl
my $input = <<'__END__';
Hi There    
                         FirstName-LastName       8       7/17/2015 1:15  PM 
Testing - 12323232323 Hello There
__END__
my ($chat,$username,$chars,$timestamp) = $input =~ m/(?im)^s*((?:w+W+)+)(w+[-,.]w+)W+(d+)W+([0-1]?d/[0-3]?d/[1-2]d{3}s+[0-2]?d:[0-5]?ds?[ap]m)/;
$chat =~ s/s+$//;  #remove trailing spaces
print "chat -> ${chat}n";
print "username -> ${username}n";
print "chars -> ${chars}n";
print "timestamp -> ${timestamp}n";

Legenda

  • m/^.../从行首开始匹配正则表达式(非替代类型(
  • (?im):不区分大小写的搜索和多行(^/$match start/end of line(
  • s*匹配零个或多个空白字符(匹配空格、制表符、换行符或表单提要(
  • ((?:w+W+)+)(匹配组$chat(匹配一个或多个由单个单词w+(字母、数字、'_'(和非单词W+(非w的所有内容,包括换行符n(组成的模式。稍后对其进行过滤以删除尾随空白
  • (w+[-,.]w+):(匹配组$username(这是我们的弱点。如果用户名不是由两个用短划线'-'或逗号','(UPDATE(或句点'.'分隔的正则表达式组成的,则整个正则表达式无法正常工作(我已经从您的问题中提取了这两种可能性,但没有直接指定(
  • (d+):(匹配组$chars(由一个或多个数字组成的数字
  • ([0-1]?d/[0-3]?d/[1-2]d{3}s+[0-2]?d:[0-5]?ds[ap]m):(匹配组$timestamp(这比其他组的拆分时间长:
    • [0-1]?d/[0-3]?d/[1-2]d{3}匹配由月(带可选前导零(、日(带可选前缀零(和年组成的日期,从1000到2999(放宽限制:(
    • [0-2]?d:[0-5]?ds?[ap]m匹配时间:小时:分钟,可选空格和"pm,pm,am,am,am,pm…"感谢上面不区分大小写的修饰符

你可以在这里在线测试

您的正则表达式显示:

^s*(.*)n*n*  # line starts with optional space followed by anything 
|      # or
s+([a-zA-Z0-9._]+)s+(d+)s+(.*)$ # spaces followed by any words followed by spaces, digits, spaces,  anything at the end of the line

考虑一下:

/^From|To$/

交替和序列一样紧密。上面实际上是说要找到一条以"Fro"开头、后跟"m"或"T"、后跟"o"、后跟行末尾的行

与此相比:

    /^(From|To)$/

上面将找到只有"From"或"To"的行

最新更新