Regex 正则表达式-文本内部不匹配?

Regex 正则表达式-文本内部不匹配?,regex,icalendar,Regex,Icalendar,我正在处理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 TRAN

我正在处理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
这会让我知道两个条目的开始和结束时间。我的想法是只匹配那些在BEGIN:VEVENT和DTSTART之间没有
FREQ=
的。然而,我不知道该怎么做。我想知道是否有人能帮我


我意识到在某一点上,一个完整的解析器是一个更好的选择,但我不熟练的解析器,我在一个轻微的时间限制。我试过使用!?操作符没有成功。

编写正则表达式来匹配您不想要的东西比匹配您想要的东西更难。通常,当我遇到这种情况时,我发现分两步做事情更容易、更快。在这种情况下,我可能会找到所有包含
FREQ=
的事件,删除这些事件,然后继续匹配我想要的开始和结束时间的结果。你能发布你用
尝试过的正则表达式吗,因为可能很容易修复。。。另外,我假设这是在Objective-C中,我猜您使用的环境支持
(但并非所有代码都是如此)

更新

好的,试试这个:

BEGIN:VEVENT.+? (?<!FREQ=.+)DTSTART;.+?([0-9]{8})T([0-9]{6}) DTEND;.+?([0-9]{8})T([0-9]{6}).+? END:VEVENT 开始:VEVENT.+?
(?为什么不使用PHP iCalendar解析器


第1行更改为
BEGIN:VEVENT.+?(!?FREQ=).+?
当我尝试使用!?运算符时。我使用的是PHP,但它应该与a/before和after兼容,我认为第二次之后带有s选项。@Josh:添加了修改的正则表达式。在Expresso中对我有效,但Expresso是基于.NET的,我没有PHP测试环境。我跳得太快了,我得到了一个可变长度的查找器PHP的ror。显然,在PHP中,look behinds必须是固定长度的。我使用了一个RegEx引擎进行设计,它显然也依赖于.NET。@Josh:那么……你最终使用了哪个表达式?我最终捕获了开始标记和结束标记之间的所有数据,当我使用这些数据时,我快速搜索以检测
FREQ
I捕获。这是一个两步的过程,不太优雅,但我想它是可行的。我在做条件语句方面取得了一些成功,但PHP PCRE引擎显然也很挑剔。 BEGIN:VEVENT.+? (?<!FREQ=.+)DTSTART;.+?([0-9]{8})T([0-9]{6}) DTEND;.+?([0-9]{8})T([0-9]{6}).+? END:VEVENT