2010-08-06 2 views
0

나는 iCal의 항목으로하고 있어요 :RegEx - 텍스트 내에서 일치하지 않습니까?

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;.+?([0-9]{8})T([0-9]{6}) 
DTEND;.+?([0-9]{8})T([0-9]{6}).+? 
END:VEVENT 

이 나에게 두 항목의 시작 시간과 종료 시간을 가져옵니다 그래서 나는 다음 한 줄 옵션와 정규식이있다. 내 생각은 BEGIN : VEVENT와 DTSTART 사이에 FREQ=이없는 것들만 일치시키는 것이었다. 그러나 나는 이것을 어떻게하는지 이해하지 못합니다. 누군가 내가 여기서 도울 수 있는지 궁금 해서요?

필자는 특정 시점에서 완전한 파서가 더 나은 옵션이라는 것을 알고 있지만, 파서에게는 익숙하지 않으며 약간의 시간 제약을 받고 있습니다. 을 사용해 보았습니다! 교환 원 성공하지 못했습니다.

답변

1

그것은 당신이 원하는 할 일을 일치하도록 다음 싶지 당신이 것들에 대한 일치하는 정규 표현식을 작성하는 더 어렵다. 보통 이런 상황에 처했을 때 두 단계로 작업을 더 쉽고 빠르게 수행 할 수 있습니다. 이 경우 에 포함 된 모든 이벤트가 FREQ=이고 그 이벤트를 제거한 다음 원하는 시작 시간과 종료 시간에 대한 결과를 계속 일치시킬 수 있습니다. !?으로 시도한 정규식을 게시 할 수 있습니까? 아마도 수정하기가 쉽기 때문입니다 ... 또한 Objective-C에 있다고 가정하고 사용중인 환경이 !?을 지원한다고 추측합니다 (그러나 전부는 아님). 이 하나를 시도

확인

UPDATE ...) 않습니다

 
BEGIN:VEVENT.+? 
(?<!FREQ=.+)DTSTART;.+?([0-9]{8})T([0-9]{6}) 
DTEND;.+?([0-9]{8})T([0-9]{6}).+? 
END:VEVENT 
+0

라인'을 시작하려면 1 바뀝니다.?.? VEVENT + (!? FREQ는 =) +'때 나는 시도했다!? 운영자. 나는 PHP를 사용하고 있지만 PCRE와 A/전후에 s 옵션을 사용해야한다. –

+0

@Josh : 수정 된 정규식을 추가했습니다. Expresso에서 작동하지만 Expresso는 .NET 기반이며 PHP 테스트 환경이 없습니다. – FrustratedWithFormsDesigner

+0

잘 작동합니다. 그건 완벽하게 작동합니다. 고맙습니다! –

관련 문제