【问题标题】:regex/regular expression 'OR'正则表达式/正则表达式“或”
【发布时间】:2013-04-10 00:50:30
【问题描述】:

我在这方面苦苦挣扎了一段时间,请您给点提示...

在 Outlook 电子邮件中,我们可以将电子邮件正文中的电子邮件信息转发为:

From: Jackson, Peter
Sent: Tuesday, 26 March 2013 08:25 PM
To: **Match, Me**; GGG
Cc: AAA, BBB; CCC, DDD; EEE, FFF
Subject: FW: Good Morning

From: Jackson, Peter
Sent: Tuesday, 26 March 2013 08:25 PM
To: AAA; GGG
Cc: BBB; **Match, Me**; DDD; EEE, FFF
Subject: FW: Good Morning

现在,如果“收件人”或“抄送”列表中有“匹配,我”,我想在“已发送”中获取日期时间。

我现在拥有的正则表达式是:

(<b>)?Sent:(</b>)?\s(?<MatchDateTime>[A-Z][a-z]{5,8},\s[0-9]{1,2}\s[A-Z][a-z]{2,9}\s[0-9]{4}\s[0-9{1,2}:[0-9][0-9]\s[A-Z]{2})(<br\s?/?>)?(\\r\\n)*?(<b>)?To:(</b>)?\s.[^<]*?(Match, Me).*?(<br\s?/?>)?(\\r\\n)*?(<b>)?Cc:(</b>)?\s.[^<]*?(Match, Me).*?(<br\s?/?>)(\\r\\n)*

这里是一些示例文本:

<span lang=\"EN-US\" style=\"font-size:10.0pt;font-family:"Tahoma","sans-serif"\"> BBB, AAA [mailto:AAA.BBB@ccc.com.au]\r\n<br>\r\n<b>Sent:</b> Tuesday, 26 March 2013 5:23 PM<br>\r\n<b>To:</b> **Match, Me**; DDD; EEE<br>\r\n<b>Cc:</b> EEE, ZZZ; GGG, FFF<br>\r\n<b>Subject:</b> RE: Good Morning<o:p></o:p></span>

<span lang=\"EN-US\" style=\"font-size:10.0pt;font-family:"Tahoma","sans-serif"\"> BBB, AAA [mailto:AAA.BBB@ccc.com.au]\r\n<br>\r\n<b>Sent:</b> Tuesday, 26 March 2013 5:23 PM<br>\r\n<b>To:</b> UUU, AAA, DDD; EEE<br>\r\n<b>Cc:</b> Match, Me; ZZZ; GGG, FFF<br>\r\n<b>Subject:</b> RE: Good Morning<o:p></o:p></span>

我的正则表达式只能匹配一个条件(在 To list 或 Cc list 中),但不能同时匹配两者,请您帮忙,谢谢!

【问题讨论】:

  • 不要使用 RegEx 解析 HTML/XML。请改用 XML/HTML 解析器。如LINQ to XMLHTML Agility Pack
  • 一般来说,您正在寻找管道字符jsfiddle.net/b9chris/8xMAm - 因为您可能知道 JS 和 C# 使用相同的正则表达式标准,因此正则表达式字符串在两者之间是兼容的。但是以这种方式使用单个正则表达式似乎太复杂了 - 将其分解为几个更简单的部分,您可能会获得的几毫秒额外性能不值得下一个编码人员使用此代码是多么不可能修改。
  • 您好,感谢您的回复。由于这是现有工作的新功能,不幸的是我必须坚持在 C# 中使用 Regex.Matches,对我来说唯一的选择可能是 Regex。

标签: html .net regex email


【解决方案1】:

这是我想出的:

(\<b\>)?Sent:(\</b\>)?\s(?<MatchDateTime>[A-Z][a-z]{5,8},\s[0-9]{1,2}\s[A-Z][a-z]{2,9}\s[0-9]{4}\s[0-9]{1,2}:[0-9][0-9]\s[A-Z]{2}).*?(To|Cc):(\</b\>)?\s[^<]*?(Match, Me)

首先,我认为最好转义所有&lt;&gt; 字符,因为它们在正则表达式语法中经常使用。在日期匹配组之后,我添加了一个非贪婪的.*? 来读取输入,直到遇到第一个ToCc。然后读取直到匹配Match, Me

【讨论】:

  • 感谢您的回复。您的帖子非常接近答案,但是,在尝试之后,我发现了一个错误:如果我们有 Sent: 2013 年 3 月 26 日星期二下午 5:23
    \r\n 收件人:DDD; EEE
    \r\n抄送: EEE, ZZZ; GGG,FFF
    \r\n主题: RE:早安

    **这里有一些文字**匹配,我regex 可以匹配整个文本,但是 Match, Me 不在 To 或 Cc 列表中。
  • 不确定我是否已经解释清楚:在除此信息块之外的其他地方的电子邮件中,我们还可以有匹配的“匹配,我”(即在某人的签名中)。正则表达式匹配从“已发送”开始,经过任何文本,然后在“匹配,我”处停止。我们只能在该电子邮件的信息块内进行匹配吗?
  • 我终于用不同的方法来避免这个错误,但你的正则表达式确实帮助了我很多,让我的更简单。谢谢!
猜你喜欢
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
相关资源
最近更新 更多