Я работаю с записями iCal:
BEGIN:VEVENT
UID:944f660b-01f8-4e09-95a9-f04a352537d2
ORGANIZER;CN=******
DTSTART;TZID="America/Chicago":20100802T080000
DTEND;TZID="America/Chicago":20100822T170000
STATUS:CONFIRMED
CLASS:PRIVATE
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
TRANSP:OPAQUE
X-MICROSOFT-DISALLOW-COUNTER:TRUE
DTSTAMP:20100802T212130Z
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
UID:aa132e2b-8a8d-4ffc-9e54-b75249e78c72
RRULE:FREQ=DAILY;COUNT=12;INTERVAL=1
SUMMARY:***********
X-ALT-DESC;FMTTYPE=text/html:<html><body><div style='font-family:Times New R
oman\; font-size: 12pt\; color: #000000\;'></div></body></html>
LOCATION:Map Room
ORGANIZER;CN=*********
DTSTART;TZID="America/Chicago":20100730T080000
DTEND;TZID="America/Chicago":20100730T170000
STATUS:CONFIRMED
CLASS:PUBLIC
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
TRANSP:OPAQUE
X-MICROSOFT-DISALLOW-COUNTER:TRUE
DTSTAMP:20100727T025231Z
SEQUENCE:0
EXDATE;TZID="America/Chicago":20100810T080000
EXDATE;TZID="America/Chicago":20100807T080000
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;RELATED=START:-PT5M
DESCRIPTION:*********
END:VALARM
END:VEVENT
Мне нужно разобрать время начала и окончания. У меня есть функция сравнения, которая определяет, находится ли переданное событие между двумя временами. Из-за повышенной сложности в подсчете времени я планирую не поддерживать рекуррентный ряд. Я хотел бы перестраховаться и убедиться, что мой код читает только первое событие как совпадение, а не второе. Так что у меня есть следующий RegEx с однострочным параметром :
BEGIN:VEVENT.+?
DTSTART;.+?([0-9]{8})T([0-9]{6})
DTEND;.+?([0-9]{8})T([0-9]{6}).+?
END:VEVENT
Это дает мне время начала и окончания обеих записей. Моя мысль состояла в том, чтобы соответствовать только тем, которые не имеют FREQ=
между BEGIN: VEVENT и DTSTART. Однако я не понимаю, как это сделать. Мне было интересно, может ли кто-нибудь помочь мне здесь?
В какой-то момент я понимаю, что полноценный парсер - лучший вариант, но у меня нет навыков работы с парсерами, и у меня небольшие ограничения по времени. Я пытался использовать !? оператор безуспешно.