.ics ファイルから複数の順序付けられたプロパティ値 (DTSTART、DTEND、SUMMARY) を選択できるものを構築しようとして、しばらくこの正規表現をいじっていました。他のオプション (一度に 1 行ずつ読み取ってスキャンするなど) はありますが、すべてを処理できる単一の正規表現を作成したいと考えていました。
サンプルパール
# 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";
}
サンプルデータ
BEGIN:VEVENT
UID:0A5ECBC3-CAFB-4CCE-91E3-247DF6C6652A TRANSP
:OPAQUE
SUMMARY:Gandalf_flinger1
DTEND:20071127T170005
DTSTART,lang=en_us:20071127T103000
DTSTAMP:20100325T003424Z
X-APPLE-BUSYEVENTS:20100325BUSYEVENTS
:
0
サンプル出力
行:
==>
20071127T103000
==>
20071127T170005
==>
Gandalf_flinger1