我试图从java中的下面的字符串中获取日期,我能够通过获取Sent:和To:之间的内容来编写正则表达式以获取此特定实例:
Matcher m2 = Pattern.compile("Sent:(.*?)To:").matcher(emailText);
但问题是,有时它可能位于From:和Date:或Sent:和Subject:
之间所以,我尝试在正则表达式中管道(OR),如下所示:
Matcher m2 = Pattern.compile("Sent:(.*?)To: | From:(.*?)To: | Sent:(.*?)Subject:).matcher(emailText);
但它不起作用。以下是我正在使用的样本。
END GOAL ,就是我可以在2017年10月19日下午4:44格式发送到数据库的日期。
SAMPLE OUTPUT:
另一项测试来自:John Doe [mailto:johndoe@gmail.com]发送时间:2017年10月19日星期四下午4:44致:Joe Schmo主题:这是一个测试! BEEEEEEEEEEEEEEEP!
SAMPLE OUTPUT2:
这是另一封电子邮件----------转发的消息----------来自:Tomislav S. Jackson日期:星期五,2017年10月20日下午2:32主题:致:Jonny Nobody
SAMPLE OUTPUT3:
转发电子邮件测试。此致Jane Doe Begin转发消息:来自:Bill Hickock日期:2017年10月23日上午9:40:56 CDT致:主题:这是测试测试,谢谢!
答案 0 :(得分:0)
这是一个你可以开始的非常自由的正则表达式,无论它在哪里都会抓住你的例子中的日期:
(Mon|Tue|Tues|Wed|Wednes|Thu|Thurs|Fri|Sat|Satur|Sun)(day)?, \w+ \d+, 20\d\d(\sat)? \d?\d:\d\d (AM|PM)?
无需检查它是否位于已发送,发件人或任何其他字段中。您可以根据需要插入更多捕获组/替换,以考虑您可能遇到的不同格式。如果您的要求需要,您可能希望将单词/数字标记替换为更具体。当你在Java中使用它时,请记住逃避反斜杠。
基于您的其他示例的小更新。但是,您需要注意的格式越多,基于正则表达式的问题答案就越复杂。我在这里已经变得非常多毛了,如果不同的部分可以处于不同的顺序,你最好放弃正则表达式并找到不同的解决方案,比如解析日期并将其放入你想要的格式中编程。
答案 1 :(得分:0)
我曾经处理过完全相同的问题 - 在事先不知道格式的情况下解析一个字符串。我设法通过编写一个很好的实用程序来解决问题。基本思想是拥有一组所有支持的格式(在属性文件中或代码之外的其他存储中)。你得到你的String并尝试逐个解析它,直到一个成功。在这种情况下,您可以灵活地添加/删除其他格式而无需修改代码。订单也很重要,因为您可能会将欧洲风格的格式放在美国之前,反之亦然,具体取决于您的偏好。我编写并发表了一篇文章,更详细地讨论了该问题(例如Java 8中提供的通配符格式)。这是链接:Java 8 java.time package: parsing any string to date