0

我有一个在文本文件中工作的电子邮件数据转储,我希望使用正则表达式提取电子邮件的内容。

目前我正在尝试从数据中删除原始请求者电子邮件的原始创建者将始终在其姓名上带有时间戳,但抄送的任何人都不会

本质上,电子邮件看起来像这样

约翰·史密斯 (XYZ RE) (M/DD/YYYY HH:MM PM):

John Smith (XYZ RE) 的电子邮件格式将再次出现在与不同人的电子邮件的下方

我创建了这个不优雅的正则表达式来获取电子邮件(它的工作原理让我很满意,我理解它更重要)

([^\s]+\s+[^\s]+\s+[(]+[A-Z]+\s+[A-Z]+[)])

我也尝试过类似的方法来检索日期,但这适用于某些日期并与其他日期一起下降

([^\s][0-9]+[/]+[0-9]+[/]+[0-9]+\s+[0-9][:][0-9]+\s+(AM|PM)[)][:])

任何人都可以帮忙吗?

我是 Regex 的新手,如果您有时间我使用 Notepad++ 对其进行测试,然后使用基于 Java 的应用程序运行它,我将不胜感激

谢谢约翰

4

3 回答 3

3

您不需要所有这些方括号,使用字符类就足够了。

对于日期/时间正则表达式,使用类似:

'\(\d+\/\d+\/\d+\s\d+:\d+ (AM|PM)\):'

\d类似于[0-9]- 更短:)

请注意,您需要转义括号,否则它们将成为正则表达式的一部分,这意味着组捕获。

正则表达式模式中的某些内容被括号括起来()意味着在这些括号中匹配的任何内容都将被“捕获”(存储在变量中以备后用)。如果您正在处理大文本,并且不需要访问匹配的字符串(例如仅替换或其他内容),那么您可以通过添加?:括号来避免捕获,如下所示:

'\(\d+\/\d+\/\d+\s\d+:\d+ (?:AM|PM)\):'
                           ^^

这不会存储匹配的字母AMPM变量,这意味着大文本的性能略好:)

于 2013-08-21T14:39:32.013 回答
1

从外观上看,您只是缺少一个+,这会将您的匹配限制为具有一位数小时字段的日期。

([^\s][0-9]+[/]+[0-9]+[/]+[0-9]+\s+[0-9]+[:][0-9]+\s+(AM|PM)[)][:])
                                        ^

您可以通过替换[^\s]with\S[0-9]with来简化您的正则表达式\d,但由于这听起来像是一次性使用的交易,所以您觉得更容易阅读的内容可能更合适。这些替换都不是必需的,它们只是捷径。

(此外,您可以替换为 ,而不是捕获“AM”或“PM” (AM|PM)[AP]M它匹配 A 或 P 后跟 M 而不捕获组。)

于 2013-08-21T14:40:21.487 回答
0

对于你的约会尝试使用这个: /^(1[0-2]|0[1-9])\/(3[01]|[12][0-9]|0[1-9])\/[0-9]{4} ([0-2][0-9]\:[0-5][0-9]) (AM|PM)$/

于 2013-08-21T14:40:43.710 回答