Как разобрать этот текстовый файл, используя только регулярные выражения? - PullRequest
0 голосов
/ 15 июля 2010

Рассмотрим файл журнала, который содержит

r100000|Tom Sawyer|2010-12-01|view.txt

Я должен разобрать это и вывести

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

Я должен использовать только регулярные выражения.

Ответы [ 5 ]

4 голосов
/ 15 июля 2010
$line = 'r100000|Tom Sawyer|2010-12-01|view.txt';
@fields = split /\|/, $line;
print $fields[0]; # r100000
2 голосов
/ 15 июля 2010

Если вы хотите использовать Регулярное выражение для его анализа,

Вы можете попробовать это:

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

if($line =~ /^([^|]+)\|([^|]+)\|([^|]+)\|([^|]+)$/)
{
$id = $1;
$name = $2;
$date = $3;
$filename = $4
}
2 голосов
/ 15 июля 2010

более простой способ - разбить строку на поля, используя разделители. Так как у вас есть труба "|" в качестве разделителей, а затем использовать его. Нет необходимости в сложном регулярном выражении. Кроме того, что если в следующий раз у вас будет больше полей?

Вот пример с awk (вы также можете использовать опцию -F для Perl)

$ 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
0 голосов
/ 23 июля 2010
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);
0 голосов
/ 15 июля 2010

Вы не упоминаете диалект 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...