Вопрос о разборе текста в Perl - PullRequest
0 голосов
/ 16 ноября 2010

Я хочу разобрать строку следующим образом:

S1,F2  title including several white spaces  (abbr) single,Here<->There,reply

И я хочу вывод, как показано ниже,

1
2
title including several white spaces
abbr
single
Here22There  # identify <-> and translate it to 22; 
reply

Мне интересно, как разобрать строку выше?

Способ 1. Я планирую разделить всю линию на четыре сегмента, а затем проанализировать отдельные подсегменты.

segment1. S1,F2

segment2. title including several white spaces

segment3. abbr

segment4. single,Here<->There,reply

Способ 2. Я просто пишу сложное выражение регулярного выражения, чтобы разобрать его.

Какой метод больше подходит для моей практики?

Ценится за любые комментарии или предложения.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

Предполагая, что ваш ввод будет в указанном формате, вы можете использовать регулярные выражения, такие как:

^S(\d+),F(\d+)\s+(.*?)\((.*?)\)\s+(.*?),(.*?),(.*)$

Ссылка на кодовую панель

1 голос
/ 16 ноября 2010

Что касается вашего первого метода , то, что вы можете сделать, это как первый разделить строку запятой , например

my $line =
 'S1,F4  title including several white spaces (abbr) single,Here<->There,reply';
 my ($field1, $field2, $field3, $field4) = split /,/, $line;

, а затем применить регулярное выражение в поле , связанное с подстрокой S1 и F2 title including several white spaces (abbr) single подобно

my ($field5) = $field1 =~ /S(\d+)/;
my ($field6, $field7, $field8, $field9) = 
                    $field2 =~ m/^F(\d+)\s+(.*?)\((.*?)\)\s+(.*?)$/;

Он будет работать для всех этих строк и поможет избежать использования и создания сложных регулярных выражений,

S1,F2  title including several white spaces  (abbr) single,Here<->There,reply
S1,F2  title including several white spaces  (abbr) single,Here<->There
S1,F2  title including several white spaces  (abbr) single,Here<->There,[reply]
...