Perl 如何仅使用正则表达式解析此文本文件?

Perl 如何仅使用正则表达式解析此文本文件?,perl,Perl,考虑一个日志文件,其中包含 r100000|Tom Sawyer|2010-12-01|view.txt 我应该分析这个并打印出来 ID:r100000 NAME:Tom Sawyer DATE:2010-12-01 FILENAME:view.txt 我应该只使用正则表达式。你没有提到RE的方言。但例如: $ echo 'r100000|Tom Sawyer|2010-12-01|view.txt' | \ perl -pe 's/^(r\d+)\|([^|]+)\|([0-9-]+)

考虑一个日志文件,其中包含

r100000|Tom Sawyer|2010-12-01|view.txt
我应该分析这个并打印出来

ID:r100000
NAME:Tom Sawyer
DATE:2010-12-01
FILENAME:view.txt

我应该只使用正则表达式。

你没有提到RE的方言。但例如:

$ echo 'r100000|Tom Sawyer|2010-12-01|view.txt' | \
  perl -pe 's/^(r\d+)\|([^|]+)\|([0-9-]+)\|(.+)/ID:\1 NAME:\2 DATE:\3 FILENAME:\4/'
ID:r100000 NAME:Tom Sawyer DATE:2010-12-01 FILENAME:view.txt

更简单的方法是使用分隔符将字符串拆分为字段。既然您使用管道作为分隔符,那么就使用它。不需要复杂的正则表达式。另外,如果下次你有更多的字段呢

这里有一个awk,您也可以使用Perl的-F选项

$ awk -F"|" '{print "ID:"$1" Name:"$2" Date:"$3" filename:"$4}' file
ID:r100000 Name:Tom Sawyer Date:2010-12-01 filename:view.txt
Perl等价物

$ perl -F"\|" -ane 'print "ID:$F[1] Name: $F[2] Date:$F[3] filename:$F[4]"' file
ID:Tom Sawyer Name: 2010-12-01 Date:view.txt
如果要使用正则表达式来解析它

你可以试试这个:

$line = r100000|Tom Sawyer|2010-12-01|view.txt;

if($line =~ /^([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)$/)
{
$id = $1;
$name = $2;
$date = $3;
$filename = $4
}
$line = r100000|Tom Sawyer|2010-12-01|view.txt;

if($line =~ /^([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)$/)
{
$id = $1;
$name = $2;
$date = $3;
$filename = $4
}
use Data::Dumper;
my %h;
my $line = 'r100000|Tom Sawyer|2010-12-01|view.txt';
@h{qw/ID NAME DATE FILENAME/} = (split /\|/, $line);
print Dumper(\%h);