使用模板从文本中提取数据

时间:2011-11-11 12:00:39

标签: c# parsing email-integration information-extraction

我正在构建一个Web服务,它接收来自多个CRM系统的电子邮件。电子邮件通常包含文本状态,例如“收到”或“已完成”以及自由文本评论。

传入电子邮件的格式不同,例如一些系统调用状态“Status:ZZZZZ”和一些“Action:ZZZZZ”。自由文本有时会出现在状态之前和之后的某些事情中。状态代码将映射到我的系统解释,并且也需要注释。

此外,我希望这些格式随着时间的推移而变化,因此可配置的解决方案可能是客户通过Web界面提供自己的模板,这是理想的。

该服务是使用.NET C#MVC 3构建的,但我对一般策略以及任何特定的库/工具/方法感兴趣。

我从来没有完全理解RegExp。如果它确实是要走的路,我会做出新的努力。 :)

1 个答案:

答案 0 :(得分:1)

我会选择正则表达式:

第一个例子,如果你只有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: ZZZZZAction: 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,您可以通过替换标记字符串来构建正则表达式。