Perl使用正则表达式来分割一行

时间:2015-12-06 15:18:28

标签: html regex perl split

我试图将下面的行拆分为<br /><br>和逗号以将其推送到数组中。我需要获得LUN-JUE,VIE,SAB和DOM的日子,以及与它们对应的小时数。我昨天开始学习perl并且坚持这个并且需要帮助。

这些是我必须做的指示,因此我不确定是否可以使用拆分。

  
      
  1. 创建一个使用正则表达式的Perl脚本或程序来读取测试文件,提取电影名称和放映时间,并创建一个html   文件显示提取的数据。
  2.   

这就是我所尝试过的,我知道我甚至没有接近。

@hours = $row.split(/[<br \/><br>]+/);

&安培;

elsif($row =~ qr{(.+)<br />(.+),(.+),(.+)<br>(.+)<br />}){
      @hours = $1;
      print "@hours\n";
}    

这是我尝试拆分的路线。

LUN - JUE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM<br>VIE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>SAB <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>DOM <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM <br/>

2 个答案:

答案 0 :(得分:1)

首先,@hours = $row.split(/[<br \/><br>]+/);语法无效perl

其次,[<br \/><br>]对你不起作用,因为它会独立地考虑每个角色,而不是作为一个群体。

因此,您应该在regex中使用分组。但是在split中,当你在分组中保留分隔符时,该组也会在结果集中被捕获,因此要删除它,保留(?:),即非捕获组。

这对你有用:

my $string='LUN - JUE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM<br>VIE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>SAB <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>DOM <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM <br/>';

my @array=split(/(?:<\s*br\s*\/\s*>|<\s*br\s*>)+/i,$string);

保留\s*将处理br标记内有多个空格的所有情况。

要获得更多理解,您应该了解perlretutsplit

答案 1 :(得分:-1)

此脚本

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $sample = 'LUN - JUE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM<br>VIE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>SAB <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>DOM <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM <br/>';

my $line_re = qr/\s*\Q<br\E\s*\/?\Q>\E\s*/i;
my $day;
my %lookup;

for my $line ( split($line_re, $sample) ) {

  $line =~ s/^\s+|\s*$//g;
  $day = $line if(!defined $line || $line =~ m/^[a-z]/i);

  if ( $line =~ m/^\d/ ) {
    my @times = split(/,/, $line);
    $lookup{$day} = [@times];
  }
}

print Dumper \%lookup;

哪个输出

$VAR1 = { 
          'VIE' => [ 
                     '10:30AM',
                     '1:40PM',
                     '4:50PM',
                     '8:00PM',
                     '11:10PM'
                   ],
          'SAB' => [ 
                     '10:30AM',
                     '1:40PM',
                     '4:50PM',
                     '8:00PM',
                     '11:10PM'
                   ],
          'LUN-JUE' => [ 
                         '10:30AM',
                         '1:40PM',
                         '4:50PM',
                         '8:00PM'
                       ],
          'DOM' => [ 
                     '10:30AM',
                     '1:40PM',
                     '4:50PM',
                     '8:00PM'
                   ]
        };