Нужна помощь с Perl reg ex? - PullRequest
       0

Нужна помощь с Perl reg ex?

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

Вот мой текстовый файл формы.

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]

Как изменить мой reg ex для работы над всеми тремя вышеуказанными формами?

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

Я пытался заменить (.*?)$/ на [.*?]$/. Не работает Думаю, мне не следует использовать [] (квадратные скобки), чтобы соответствовать возможному слову [reply] (включая []).

На самом деле, мой общий вопрос должен заключаться в том, как лучше сопоставить возможные символы в Reg exp с использованием Perl? Я посмотрел онлайн PerlDoc веб-страницы. Но мне сложно найти полезную информацию на основе моего уровня знаний Perl. Вот почему я также задал несколько глупых вопросов.

Спасибо за ваши комментарии и предложения.

Ответы [ 4 ]

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

Вы можете сделать последнюю часть необязательной, используя (?:..)? как:

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

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

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

Попробуйте

/^S(\d),F(\d)\s+(.*?)\((.*?)\)\s+(.*?),(.*?)(,(\[reply\]|reply))?$/

Это будет соответствовать необязательной (?) части ,(\[reply\]|reply), которая либо ,[reply], либо ,reply, т.е.

  • (ничего)
  • ,reply
  • [,reply]

Кстати, ваш [,] означает «один символ из следующих: ,».Точно так же, как буквальное , в регулярном выражении. Если вы хотите, чтобы ваш [,](.*?)$ работал, вы должны использовать (,(.+))?$, чтобы ничего не совпадать или запятую, за которой следует любая (непустая) строка.


РЕДАКТИРОВАТЬ

Если следующие параметры также действительны:

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

Тогда вы можете использовать (,\[?reply\]?)? в конце.

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

Как насчет использования классов с отрицательными символами:

 /^S(\d),F(\d)\s+([^()]*?)\s+\(([^()]+)\)\s+([^,]*),([^,]*)(?:,(.*?))?$/

При включении в этот скрипт:

#!/bin/perl
use strict;
use warnings;
while (<>)
{
    chomp;
    my($s,$f,$title,$abbr,$single,$here,$reply) =
        $_ =~ m/^S(\d),F(\d)\s+([^()]*?)\s+\(([^()]+)\)\s+([^,]*),([^,]*)(?:,(.*?))?$/;
    $reply ||= "<no reply>";
    print "S$s F$f <$title> ($abbr) $single : $here : $reply\n";
}

И запуск на исходном файле данных, он производит:

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

Вы, вероятно, должны также использовать суффикс 'xms' к выражению, чтобы вам было проще документировать его:

#!/bin/perl
use strict;
use warnings;

while (<>)
{
    chomp;

    my($s,$f,$title,$abbr,$single,$here,$reply) =
        $_ =~ m/^
                S(\d) ,             # S1
                F(\d) \s+           # F2
                ([^()]*?) \s+       # Title
                \(([^()]+)\) \s+    # (abbreviation)
                ([^,]*) ,           # Single
                ([^,]*)             # Here or There
                (?: , (.*?) )?      # Optional reply
                $
               /xms;

    $reply ||= "<no reply>";
    print "S$s F$f <$title> ($abbr) $single : $here : $reply\n";
}

Признаюсь, я все еще могу писать однострочных монстров - яЯ пытаюсь исправить мои пути.

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

Вы знаете, что скобки в регулярном выражении зарезервированы для объявления наборов символов, которые вы хотите сопоставить? Итак, для настоящей скобки вам нужно ее убрать или заключить в скобки ([[] или []]), разве это не запутано?

Попробуйте (\[.*?\]|.*?), чтобы указать, что дополнительные скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...