Лучший способ написать это регулярное выражение, чтобы соответствовать многоупорядоченному списку свойств? - PullRequest
1 голос
/ 12 апреля 2010

Я какое-то время разбирался с этим регулярным выражением, пытаясь создать что-то, что могло бы выбрать несколько упорядоченных значений свойств (DTSTART, DTEND, SUMMARY) из файла .ics. У меня есть другие варианты (например, чтение по одной строке за раз и сканирование), но я хотел создать одно регулярное выражение, которое может обрабатывать все это.

SAMPLE PERL

# There has got to be a better way...
my $x1 = '(?:^DTSTART[^\:]*:(?<dts>.*?)$)';
my $x2 = '(?:^DTEND[^\:]*:(?<dte>.*?)$)';
my $x3 = '(?:^SUMMARY[^\:]*:(?<dtn>.*?)$)';
my $fmt = "$x1.*$x2.*$x3|$x1.*$x3.*$x2|$x2.*$x1.*$x3|$x2.*$x3.*$x1|$x3.*$x1.*$x2|$x3.*$x2.*$x1";

if ($evts[1] =~ /$fmt/smo) {
printf "lines:\n==>\n%s\n==>\n%s\n==>\n%s\n", $+{dts}, $+{dte}, $+{dtn};
} else {
print "Failed.\n";
}

ОБРАЗЕЦ ДАННЫХ

НАЧАТЬ: VEVENT
UID: 0A5ECBC3-CAFB-4CCE-91E3-247DF6C6652A
TRANSP: OPAQUE
РЕЗЮМЕ: Gandalf_flinger1
DTEND: 20071127T170005
DTSTART, LANG = en_US: 20071127T103000
DTSTAMP: 20100325T003424Z
X-APPLE-EWS-BUSYSTATUS: BUSY
ПОСЛЕДОВАТЕЛЬНОСТЬ: 0
КОНЕЦ: VEVENT

ОБРАЗЕЦ ВЫХОДА

строка:
==>
20071127T103000
==>
20071127T170005
==>
Gandalf_flinger1

Ответы [ 4 ]

2 голосов
/ 12 апреля 2010

CPAN - ваш друг:

vFile

Парсер iCal

Вы будете вытягивать волосы до тех пор, пока они не станут лысыми без парсера в формате vFile (кроме обычных файлов). Регулярно использовать это очень сложно.

1 голос
/ 12 апреля 2010

Вместо того, чтобы переставлять три регулярных выражения в один большой шаблон с OR, почему бы не проверить эти три шаблона отдельно, поскольку (учитывая привязку $ s) они не могут перекрываться?

my $x1 = qr/(?:^DTSTART[^:]*:(?<dts>.*?)$)/smo;
my $x2 = qr/(?:^DTEND[^:]*:(?<dte>.*?)$)/smo;
my $x3 = qr/(?:^SUMMARY[^:]*:(?<dtn>.*?)$)/smo;

if ($evts[1] =~ $x1 and $evts[1] =~ $x2 and $evts[1] =~ $x3)
{
    # ...
}

(Я также превратил переменные x в сами шаблоны и удалил ненужные escape в классах символов.)

0 голосов
/ 12 апреля 2010

Это ужасно ... Я думаю, что "лучший способ" - сопоставлять каждое свойство, по одному за раз.

0 голосов
/ 12 апреля 2010

Лучше использовать три регулярных выражения и немного дополнительной логики. Эта проблема не подходит для регулярных выражений.

...