Вот отправная точка того, что я делаю, исходя из правила повторения спецификации RFC-5545 . Это не полная спецификация и может сломаться при определенных входных данных, но это должно помочь вам. Я думаю, что все это должно быть выполнимо с использованием RegEx, и что-то тяжелое, чем рекурсивный приличный парсер, будет излишним.
RRULE:(?:FREQ=(DAILY|WEEKLY|SECONDLY|MINUTELY|HOURLY|DAILY|WEEKLY|MONTHLY|YEARLY);)?(?:COUNT=([0-9]+);)?(?:INTERVAL=([0-9]+);)?(?:BYDAY=([A-Z,]+);)?(?:UNTIL=([0-9]+);)?
Я строю это, используя http://regexstorm.net/tester.
Используемый мной тестовый ввод:
DTSTART; TZID = Америка / Чикаго: 20140711T133000 \ nDTEND; TZID = Америка / Чикаго: 20140711T163000 \ nRRULE: FREQ = ЕЖЕНЕДЕЛЬНИК; ИНТЕРВАЛ = 8; BYDAY = FR, ПОКА = 20141101
DTSTART; TZID = Америка / Чикаго: 20140711T133000 \ nDTEND; TZID = Америка / Чикаго: 20140711T163000 \ nRRULE: FREQ = ЕЖЕНЕДЕЛЬНИК; COUNT = 5; ИНТЕРВАЛ = 8; BYDAY = FR, ПОКА = 20141101
DTSTART; TZID = Америка / Чикаго: 20140711T133000 \ nDTEND; TZID = Америка / Чикаго: 20140711T163000 \ nRRULE: FREQ = ЕЖЕНЕДЕЛЬНИК; BYDAY = FR, ПОКА = 20141101
Результаты сопоставления образцов будут выглядеть так:
Index Position Matched String $1 $2 $3 $4 $5
0 90 RRULE:FREQ=WEEKLY;INTERVAL=8;BYDAY=FR;UNTIL=20141101 WEEKLY 8 FR 20141101
1 236 RRULE:FREQ=WEEKLY;COUNT=5;INTERVAL=8;BYDAY=FR;UNTIL=20141101 WEEKLY 5 8 FR 20141101
2 390 RRULE:FREQ=WEEKLY;BYDAY=FR;UNTIL=20141101 WEEKLY FR 20141101
Использование как:
string freqPattern = @"RRULE:(?:FREQ=(DAILY|WEEKLY|SECONDLY|MINUTELY|HOURLY|DAILY|WEEKLY|MONTHLY|YEARLY);?)?(?:COUNT=([0-9]+);?)?(?:INTERVAL=([0-9]+);?)?(?:BYDAY=([A-Z,]+);?)?(?:UNTIL=([0-9]+);?)?";
MatchCollection mc = Regex.Matches(rule, freqPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
string frequency = m.Groups[1].ToString();
string count = m.Groups[2].ToString();
string interval = m.Groups[3].ToString();
string byday = m.Groups[4].ToString();
string until = m.Groups[5].ToString();
System.Console.WriteLine("recurrence => frequency: \"{0}\", count: \"{1}\", interval: \"{2}\", byday: \"{3}\", until: \"{4}\"", frequency, count, interval, byday, until);
}