我正在使用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
这可以获得两个条目的开始和结束时间。我的想法是只匹配在BEGIN:VEVENT和DTSTART之间没有FREQ=
的那些。但是,我不明白该怎么做。我想知道是否有人可以帮助我吗?
我意识到在某个时刻,一个完整的解析器是一个更好的选择,但我不熟练解析器,我受到一个小时间限制。我试过使用!?运营商没有成功。
答案 0 :(得分:1)
编写一个正则表达式来匹配你不想要的东西然后匹配 想要的东西更难。通常当我遇到这种情况时,我发现通过两个步骤做事更容易,更快捷。在这种情况下,我可能会发现做包含FREQ=
的所有事件,删除这些事件,然后继续匹配我想要的开始和结束时间的结果。你可以用!?
发布你试过的正则表达式,因为它可能很容易修复......而且,我认为这是在Objective-C中,我猜你正在使用的环境支持{{1 (但不是所有人都这样做)......
<强>更新强>
好的,试试这个:
BEGIN:VEVENT.+? (?<!FREQ=.+)DTSTART;.+?([0-9]{8})T([0-9]{6}) DTEND;.+?([0-9]{8})T([0-9]{6}).+? END:VEVENT
答案 1 :(得分:1)
为什么不使用PHP iCalendar解析器?