[英]Trying to extract information from an email with .NET regex
我正在尝试在股票促销“ tout”电子邮件的“免责声明”区域(部分垃圾邮件)中提取一些信息。
通常,兜售者将对以下内容免责:
XYZ公司已获得为期两周的ABC股票促销的五万美元补偿。
我有一个正则表达式适用于这种情况(按目前的情况来看可能不是最有效的),并且它似乎适用于大多数情况。 但是,当免责声明使用网址引用促销公司(即www.companyxyz.com而不是XYZ公司)时,我的正则表达式会捕获“ .com”,而我尝试捕获的其余短语-但是而不是“ www.companyxyz”部分。
这是我的正则表达式方法:
public string ExtractCompensationLine(string message)
{
string compensationLine = string.Empty;
string messageLine = Regex.Replace(message, "[\n\r\t]", " ");
string leftPrefix = @"\.((\w|\s|\d|\,)+";
string rightPrefix = @"(\w|\s|\d|\,)+\.)";
string[] phrases =
{
@"has been compensated",
@"we were also paid",
@"has been previously compensated",
@"currently being compensated",
@"the company has compensated",
@"has agreed to be compensated",
@"have been compensated up to",
@"dollars from a third party",
@"the company will compensate us"
};
foreach (string phrase in phrases)
{
string pattern = leftPrefix + phrase + rightPrefix;
Regex compensationRegex = new Regex(pattern, RegexOptions.IgnoreCase);
Match match = compensationRegex.Match(messageLine);
if (match.Success)
{
compensationLine += match.Groups[1].Value;
}
}
return compensationLine;
}
因此,正则表达式从句子的第一个单词捕获整个短语(通过查找句子的前一个句号,直到句子的最后一个句号。但是这些网址对我的正则表达式不利。
如果我正确地理解了您的问题,给定一个包含给定短语之一的句子,则您希望从该句子的开头到其结尾或行尾。 您面临的挑战是找到要匹配的句子之前的句子结尾。 因此,您需要匹配“。”(句号后跟空白)。然后匹配其余部分。
我不明白为什么您会使用“(\\ w | \\ s | \\ d | \\,)”而不是“。”。 它不会给出我上面描述的结果,但是我将保持原样,仅关注您描述的问题。
所以试试这个:
leftPrefix = @"(\.*\s+)*?((\w|\d|\,)+";
(。* \\ s +)*:匹配任何字符,后跟一个句点,后跟空白。
由于我使用括号将这个新的子表达式分组,因此您将拥有一个新的捕获组,这意味着您需要使用Match对象的Captures集合,而不是Value。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.