Использование регулярного выражения Perl для поиска элементов - PullRequest
0 голосов
/ 03 мая 2018

У меня есть настроенные сценарии Perl, которые я использую для извлечения данных из текстового файла, но одна вещь, которая не будет отображаться, это что-то, начинающееся со звездочки. Вот код, который у меня есть:

while(<INFILE>) {
   chomp $_;

    if (m/^\s*$/) {
        next;
    }

    my @fields = split(/\  /,$_);
    my @output;

    foreach my $field(@fields) {
        if($field =~ /^\*?[ABMQRWY][A-Z0-9]{4}235 / ) {
            push @output,$field;
        }
    }
}

Оператор My if захватывает все, что имеет длину 8 символов, но иногда перед заданиями стоит *, который он не будет тянуть. Как мне это включить? Я знаю, что мне нужно избежать этого, но не знаю, где его поставить.

Вот несколько примеров данных, которые я извлекаю:

W50DW235 DW
M50DW235 DW
Q0608235 08
APJ40235 40
M3515235 15
M34DW235 DW
M3408235 08
RES08235 08
BSP20235 20
W1208235 08
B3008235 08

Это необработанные строки из файла:

18122/0655 18122/0700  W50DW235 DW        LEV001  002  D50DW235
18122/0735 18122/0740  M50DW235 DW        LEV002  002  W50DW235

Строка, из которой звездочка не будет вытягиваться, выглядит следующим образом:

18123/0300 18123/0400 *D1708235 08        LEV001  001

Для извлечения данных я использую следующее, которое ловит элементы с двумя пробелами:

my @fields = split(/\  /,$_);

1 Ответ

0 голосов
/ 03 мая 2018

Это не имеет ничего общего со звездочкой! Элемент, отмеченный звездочкой, - *D1708235, но вашему регулярному выражению требуется, чтобы первый буквенный символ был [ABMQRWY], который не включает D.

Тем не менее, вот приведенный пример:

my @output;

while(<>) {
    chomp;                       # Don't need to specify $_ - it's the default
    next if /^\s*$/;             # Ditto, and the single-line form for readability
    #print;     # If you want to see what it's doing

    my @fields = split;          # Split $_ on whitespace-separated fields

    foreach my $field (@fields) {
        #print "-$field-\n";
        push @output, $field     # Again, single-line form
            if $field =~ /^\*?[ABDMQRWY][A-Z0-9]{4}235/;
    }                         #  ^ the missing link   ^ no trailing whitespace
}

print "Results:\n", join("\n", @output), "\n";

Я удалил конечные пробелы из регулярного выражения $field, потому что split создаст поля, которые не имеют ни начальных, ни конечных пробелов.

Введите:

W50DW235 DW
M50DW235 DW
Q0608235 08
APJ40235 40
M3515235 15
M34DW235 DW
M3408235 08
RES08235 08
BSP20235 20
W1208235 08
B3008235 08

18122/0655 18122/0700 W50DW235 DW LEV001 002 D50DW235
18122/0735 18122/0740 M50DW235 DW LEV002 002 W50DW235

18123/0300 18123/0400 *D1708235 08 LEV001 001

Выход:

Results:
W50DW235
M50DW235
Q0608235
APJ40235
M3515235
M34DW235
M3408235
RES08235
BSP20235
W1208235
B3008235
W50DW235
D50DW235
M50DW235
W50DW235
*D1708235
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...