RegEx - не совпадает внутри текста?
Я работаю с записями 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=
между НАЧАЛО:VEVENT и DTSTART. Однако я не понимаю, как это сделать. Мне было интересно, может ли кто-нибудь помочь мне здесь?
В какой-то момент я понимаю, что лучше всего использовать полноценный парсер, но у меня нет навыков работы с парсерами, и у меня небольшие ограничения по времени. Я пытался с помощью !? Оператор без успеха.
2 ответа
Труднее написать регулярное выражение для соответствия вещам, которые вы не хотите, чтобы соответствовать вещам, которые вы хотите. Обычно, когда я сталкиваюсь с этой ситуацией, мне легче и быстрее делать вещи в два этапа. В этом случае я, вероятно, найду все события, которые содержат FREQ=
, удалите эти события, затем продолжите сопоставление результатов для времени начала и окончания, которое я хочу. Не могли бы вы опубликовать регулярное выражение, с которым вы пытались !?
потому что, может быть, это легко исправить... Кроме того, я предполагаю, что это в Objective-C, и я предполагаю, что среда, которую вы используете, поддерживает !?
(но не все они делают)...
ОБНОВИТЬ
Хорошо, попробуйте это:
НАЧАТЬ:VEVENT +.? (?!
Почему бы не использовать парсер PHP iCalendar?