使用模板从文本中提取数据
本文关键字:提取 数据 文本 | 更新日期: 2023-09-27 18:14:05
我正在构建一个接收来自多个crm系统的电子邮件的web服务。电子邮件通常包含文本状态,例如:"收到"或"完成"以及免费文本评论。
传入邮件的格式是不同的,例如有的系统将状态称为"status: ZZZZZ",有的系统将状态称为"Action: ZZZZZ"。自由文本有时出现在状态之前,然后出现在状态之后。状态码将映射到我的系统解释,并且注释也是必需的。
此外,我希望格式随着时间的推移而改变,所以一个可配置的解决方案,可能由客户通过web界面提供他们自己的模板将是理想的。
该服务是使用。net c# MVC 3构建的,但我对一般策略以及任何特定的库/工具/方法感兴趣。
我从来没有真正理解过RegExp。我将再作一次努力,万一这确实是可行的办法。:)
我会选择regex:
第一个例子,如果您只有类似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
,您通过替换标记字符串来构建正则表达式。