В настоящее время я работаю над парсером для наших внутренних файлов журналов (генерируемых log4php, log4net и log4j). До сих пор у меня есть хорошее регулярное выражение для анализа журналов, за исключением одного раздражающего бита: некоторые сообщения журнала занимают несколько строк, которые я не могу сопоставить должным образом. У меня сейчас есть регулярное выражение:
(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}):\d{2}:\d{2}),\d{3})\s(?<message>.+)
Формат журнала (который я использую для тестирования парсера) такой:
07/23/08 14:17:31,321 log
message
spanning
multiple
lines
07/23/08 14:17:31,321 log message on one line
Когда я запускаю парсер прямо сейчас, я получаю только строку, с которой начинается журнал. Если я изменю его на несколько строк, я получу только один результат (весь файл журнала).
@ samjudson:
Вам необходимо передать флаг RegexOptions.Singleline в регулярное выражение, чтобы "." соответствует всем символам, а не только всем символам, кроме новых строк (по умолчанию).
Я пробовал это, но тогда это соответствует всему файлу. Я также пытался установить группу сообщений на. +? (не жадный), но затем он соответствует одному символу (что я тоже не ищу).
Проблема в том, что шаблон сообщения совпадает и с группой дат, поэтому, когда оно не прерывается на новой строке, оно просто продолжается и включается и продолжается.
Сейчас я использую это регулярное выражение для группы сообщений. Это работает, если в сообщении журнала нет шаблона, совпадающего с началом сообщения журнала.
(?<message>(.(?!\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3}\s\[\d{4}\]))+)