RegEx - не совпадает внутри текста? - PullRequest
0 голосов
/ 06 августа 2010

Я работаю с записями 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. Однако я не понимаю, как это сделать. Мне было интересно, может ли кто-нибудь помочь мне здесь?

В какой-то момент я понимаю, что полноценный парсер - лучший вариант, но у меня нет навыков работы с парсерами, и у меня небольшие ограничения по времени. Я пытался использовать !? оператор безуспешно.

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Почему бы не использовать анализатор PHP iCalendar?

http://www.phpclasses.org/browse/file/16660.html

1 голос
/ 06 августа 2010

Труднее написать регулярное выражение для соответствия вещам, которые вы не хотите затем сопоставить с вещами, которые делают .Обычно, когда я сталкиваюсь с этой ситуацией, мне легче и быстрее делать вещи в два этапа.В этом случае я бы, вероятно, нашел все события, которые do содержит FREQ=, удалил эти события, а затем продолжил сопоставление результатов для желаемого времени начала и окончания.Не могли бы вы опубликовать регулярное выражение, которое вы пробовали с !?, потому что, возможно, это легко исправить ... Кроме того, я предполагаю, что это в Objective-C, и я предполагаю, что среда, которую вы используете, поддерживает !? (ноне все из них) ...

ОБНОВЛЕНИЕ

Хорошо, попробуйте это:

BEGIN:VEVENT.+?
(?<!FREQ=.+)DTSTART;.+?([0-9]{8})T([0-9]{6})
DTEND;.+?([0-9]{8})T([0-9]{6}).+?
END:VEVENT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...