Perl正则表达式问题

时间:2011-03-05 12:10:42

标签: regex perl

我编写了一个Perl程序,它从文本文件中读取文本并打印出来。

我想打印出具有特定格式的行。

例如,有一些这样的行:

information:
Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir
end of Information.

我想只读这三行:

Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir

我认为字段的含义是:

Ahmad.prn <- file name
592118 <- size of file
2001:7:5 <- created date
/Essay <- path of file

我的代码是:

#!/usr/bin/perl
use strict;
use warnings;

open (my $infh, "<", $file)||die "cant open";

while(my $line = <$infh>) {
    chomp ($line);
    if ($line =~ /(what regular expression do I have to put in here?)/) {
        print "$line";
    }
}

close ($infh);

5 个答案:

答案 0 :(得分:3)

如果你需要的行总是以/ Essay结尾,你可以使用以下正则表达式

/:\/Essay$/

编辑1 :看起来中间部分只是数字,你可以这样匹配。

/:\d+:\d+:\d+:\d+:/

答案 1 :(得分:0)

   $line =~ m{
   ^
   (\w+\.\w+) # filename stored as $1
   :
   (\d+) # size stored as $2
   :
   (\d{4}) # year stored as $3
   :
   (\d+) # month stored as $4
   :
   (\d+) # day stored as $5
   :
   (.*) # path stored as $6
   $
   }x

答案 2 :(得分:0)

因为你有这种格式的Ahmad.prn:592118:2001:7:5:/ Essay

Ahmad.prn <- file name
592118 <- size of file
2001:7:5 <- created date
/Essay <- path of file

你可以使用这个正则表达式

/^\s*(\S+):(\d+):(\d+:\d+:\d+):(\S+)\s*$/

有了这个,你的文件名为1美元,文件大小为2美元,创建日期为3美元,文件路径为4美元

我在行的开头和结尾添加了可选空格,如果你想在之后或之前允许可选空格:你可以添加\ s *

答案 3 :(得分:0)

#!/usr/bin/perl
use strict;

my $inputText = qq{
Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir
end of Information.
};

my @input = split /\n/, $inputText;
my $i = 0;
while ($input[$i] !~ /^end of Information.$/) {
    if ($input[$i] !~ /:/) {
        $i++;
        next;
    }
    my ($fileName, $fileSize, $year, $month, $day, $filePath) = split /:/, $input[$i];
    print "$fileName\t $fileSize\t $month/$day/$year\t $filePath\n";
    $i++;
}

答案 4 :(得分:0)

$line =~ ([a-zA-Z.]+):(\d+):(\d+):(\d+):(\d+):([\/A-Za-z]+)

$name = $1; #Ahmad.prn
$id = $2; #592118
$year = $3; #2001
$dir = $6; #/Essay 

注意:循环使用多个名称