В настоящее время я использую следующее регулярное выражение для удаления первого элемента беседы из почтового элемента Outlook HTML:
.*?>(([^:]+?):<.*?\2):
Чтобы удалить первый элемент беседы, я просто заменяю первое вхождение группы 1 значением группы 2. В .NET это будет выглядеть примерно так:
private static readonly Regex LAST_CONVERSATION_REPLACE_PATTERN = new Regex(@".*?>(([^:]+?):<.*?\2):", RegexOptions.Compiled);
// ...
MatchCollection matches = LAST_CONVERSATION_REPLACE_PATTERN.Matches(htmlMessageBody);
if (matches.Count > 0)
{
Match match = matches[0];
if (match.Groups.Count > 2)
{
return htmlMessageBody.ReplaceFirst(match.Groups[1].ToString(), match.Groups[2].ToString());
}
}
ReplaceFirst
— это мой собственный метод расширения строки. Тем не менее, производительность этого немного разочаровывает. В то время как Regex Coach может применить это к огромным почтовым элементам за микросекунду, в надстройке Outlook это занимает до 10 секунд.
Производительность значительно улучшится, если я заменю шаблон этой явной альтернативой:
.*?>(From:<.*?From):
Используя это регулярное выражение, мне требуется меньше секунды, чтобы получить то, что я хочу. Однако это будет зависеть от языка, и поэтому я бы предпочел предыдущий вариант. Есть ли способ ускорить работу в .NET? Или есть сторонняя библиотека регулярных выражений, которая могла бы работать лучше?
Спасибо за любые предложения и с наилучшими пожеланиями
Паскаль
Match match = LAST_CONVERSATION_REPLACE_PATTERN.Match(htmlMessageBody);
if (match.Success) { //...
Так что теперь это просто вопрос любопытства :-) . - person Pascal Kesseli   schedule 19.07.2012