Используя регулярное выражение для парсинга транскрипт чата


Мне нужно классифицировать каждую строку как "объявить, шепотом или в чате", когда у меня уже разобралась, мне нужно, чтобы извлечь определенные ценности должны быть обработаны.

Сейчас мое регулярное выражение выглядит следующим образом:

var regex = new Regex(@"^\[(\d{2}:\d{2}:\d{2})\]\s*(?:(\[System Message\])?\s*<([^>]*)>|((.+) Whisper You :))\s*(.*)$");
  • Группа 0-это все сообщение.
  • Группа 1-это час времени, когда сообщение было отправлено.
  • Группа 2 является ли это новостью или чат.
  • Группа 3-Кто послал объявить.
  • Группа 4-Если это был шепот или нет.
  • Группа 5-тот, кто послал шепот.
  • Группа 6 является отправленное сообщение пользователь или система.

Классифицировать каждую строку:

if 4 matches
 means it is a whisper
   else if 2 matches
     means it is an announce
       else
         normal chat

Я должен что-то изменить, чтобы мой regex чтобы сделать его более точного/точного на матчи ?

Образец данных:

[02:33:03] John Whisper You :  Heya
[02:33:03] John Whisper You :  How is it going
[02:33:12] <John> [02:33:16] [System Message] bla bla
[02:33:39] <John> heya
[02:33:40] <John> hello :S
[02:33:57] <John> hi
[02:33:57] [System Message] <John> has left the room 
[02:33:57] [System Message] <John> has entered the room 


388
4
задан 31 мая 2011 в 10:05 Источник Поделиться
Комментарии
1 ответ

Вы всегда можете разбить его на несколько строк, чтобы сделать его более читабельным. Вы можете также использовать именованные группы, которые принимают "магии" из номера группы (4 == прошептать, 3 == нормальный и т. д.).

        var regex = new Regex(@"^\[(?<TimeStamp>\d{2}:\d{2}:\d{2})\]\s*" +
@"(?:" +
@"(?<SysMessage>\[System Message\])?\s*" +
@"<(?<NormalWho>[^>]*)>|" +
@"(?<Whisper>(?<WhisperWho>.+) Whisper You :))\s*" +
@"(?<Message>.*)$");

string data = @"[02:33:03] John Whisper You : Heya
[02:33:03] John Whisper You : How is it going
[02:33:12] <John> [02:33:16] [System Message] bla bla
[02:33:39] <John> heya
[02:33:40] <John> hello :S
[02:33:57] <John> hi
[02:33:57] [System Message] <John> has left the room
[02:33:57] [System Message] <John> has entered the room";

foreach (var msg in data.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
{
Match match = regex.Match(msg);
if (match.Success)
{
if (match.Groups["Whisper"].Success)
{
Console.WriteLine("[whis from {0}]: {1}", match.Groups["WhisperWho"].Value, msg);
}
else if (match.Groups["SysMessage"].Success)
{
Console.WriteLine("[sys msg]: {0}", msg);
}
else
{
Console.WriteLine("[normal from {0}]: {1}", match.Groups["NormalWho"].Value, msg);
}
}
}

3
ответ дан 31 мая 2011 в 11:05 Источник Поделиться