Выражение регулярного выражения для разделения строки на три сегмента в Perl - PullRequest
1 голос
/ 20 июля 2010

Я анализирую текстовый файл и получаю несколько строк в форме, показанной ниже.

Затем я пытаюсь разбить каждую строку на три сегмента: Part1: sf;часть2: имя;part3: direction.

Но теперь я сталкиваюсь с трудностями в том, как написать свое регулярное выражение.Я думал о разделении на пробелы и использовании массива для объединения новых строк:

S15,F49  Large Recipe Download Request (LRDR)   S,H->E,reply

my ($sf, $name, $direction) =~ / I don't know how to implement here/

Как я могу получить $ sf = S15,F49 // другие строки, такие как S1,F11;S6,F1;etc

$ name = Large Recipe Download Request (LRDR) // другое имя для другого $ sf.

$ direction = S,H->E,reply; // некоторое время это M,H<-E,reply или S,H<->E или S,H->E,[reply] и т. д. Между каждым из подпунктов для part3 нет пробелов: $ direction

Ответы [ 3 ]

4 голосов
/ 20 июля 2010

Если в элементах $sf и $direction нет пробелов, вы можете применить следующий код к каждой строке:

if ($subject =~ m/^(\S+)\s+(.*?)\s+(\S+)$/) {
    $sf = $1;
    $name = $2;
    $direction = $3;
} else {
    // no match found
}

Пояснение:

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

(\S+): сопоставить один или несколько непробельных символов. Захватите матч в $1.

\s+: сопоставить один или несколько пробелов (= разделитель (и) следующему элементу).

(.*?): сопоставьте любое количество символов, как можно меньше, чтобы обеспечить общее совпадение, и запишите его в $2. *

\s+(\S+): аналогично вышеприведенному - сопоставить разделитель (и) пробела и непробельные символы -> $3.

$: закрепить поиск в конце строки.


* Причина ленивого квантификатора *? заключается в том, что в противном случае эта часть регулярного выражения также будет охватывать все следующие разделители пробелов, кроме последнего.

2 голосов
/ 20 июля 2010
my $str = "S15,F49  Large Recipe Download Request (LRDR)   S,H->E,reply";

$str =~ /^([^\s]+)   # sf: anything except whitespace until first whitespace
           \s+
           (.+)      # name: anything 
           \s+
           ([^\s]+)$ # direction: anything except whitespace, from last
                     # whitespace to the end
        /x;
my ($sf, $name, $direction) = ($1, $2, $3);
print $sf, "\n", $name, "\n", $direction, "\n";
1 голос
/ 20 июля 2010

Из того, что вы показываете, это должно работать:

my ( $sf, $name, $direction ) = split /\s{2,}/, $line;

Разделить на два или более пробелов.

Это будет автоматически chomp:

my ( $sf, $name, $direction ) = split /\s{2,}|\n/, $line;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...