Извлечение данных из текста с использованием шаблонов - PullRequest
0 голосов
/ 11 ноября 2011

Я создаю веб-сервис, который принимает электронные письма от нескольких CRM-систем. Электронные письма обычно содержат текстовый статус, например «Получено» или «Завершено», а также текстовый комментарий.

Форматы входящей электронной почты разные, например, некоторые системы называют статус «Статус: ZZZZZ», а некоторые «Действие: ZZZZZ». Свободный текст иногда появляется перед статусом, а кое-что после. Коды состояния будут привязаны к моей системной интерпретации, и комментарий также необходим.

Более того, я ожидаю, что форматы со временем меняются, поэтому было бы идеальным решение, которое можно настраивать, возможно, заказчиками, предоставляющими свои собственные шаблоны через веб-интерфейс.

Сервис построен с использованием .NET C # MVC 3, но меня будут интересовать общие стратегии, а также любые конкретные библиотеки / инструменты / подходы.

Я никогда не думал о RegExp. Я приложу новые усилия на случай, если это действительно путь. :)

1 Ответ

1 голос
/ 11 ноября 2011

Я бы выбрал регулярное выражение:

Первый пример, если у вас было только Status: ZZZZZ - подобные сообщения:

String status = Regex.Match(@"(?<=Status: ).*");
// Explanation of "(?<=Status: ).*" :
// (?<=       Start of the positive look-behind group: it means that the 
//            following text is required but won't appear in the returned string
// Status:    The text defining the email string format
// )          End of the positive look-behind group
// .*         Matches any character

Второй пример, если у вас было только Status: ZZZZZ и Action: ZZZZZ -подобные сообщения:

String status = Regex.Match(@"(?<=(Status|Action): ).*");
// We added (Status|Action) that allows the positive look-behind text to be 
// either 'Status: ', or 'Action: '

Теперь, если вы хотите предоставить пользователю возможность предоставить свой собственный формат, вы можете придумать что-то вроде:

String userEntry = GetUserEntry(); // Get the text submitted by the user
String userFormatText = Regex.Escape(userEntry);
String status = Regex.Match(@"(?<=" + userFormatText + ").*");

Это позволит пользователю отправлять его формат, например Status:, или Action:, или This is my friggin format, now please read the status --> ...

. Часть Regex.Escape(userEntry) важна, чтобы гарантировать, что пользователь не сломаетсяВаше регулярное выражение, отправив специальный символ, например \, ?, * ...


Чтобы узнать, отправляет ли пользователь значение состояния до или после текста формата, у вас есть несколько решений:

  • Вы можете спросить пользователя, где находится его значение статуса, а затем построить соответствующее регулярное выражение:

    if (statusValueIsAfter) {
        // Example: "Status: Closed"
        regexPattern = @"(?<=Status: ).*";
    } else {
        // Example: "Closed:Status"
        regexPattern = @".*(?=:Status)";  // We use here a positive look-AHEAD
    }
    
  • Или вы можете бытьРазумнее и ввести систему тегов для входа пользователя.Например, пользователь отправляет Status: <value> или <value>=The status, а вы строите регулярное выражение, заменяя строку тегов.

...