2012-02-19 140 views
2

匹配RFC 2822日期的最佳正则表达式是什么?RFC 2822日期正则表达式

基本上我想匹配Date: Sun, 19 Feb 2012 16:25:02 +0000出现在我收到的一些电子邮件中,但理想情况是独立于语言。

我没有在网上找到下面的正则表达式,但不知道如何做一个月语言无关(但仍符合其他) - 我相信,一个月应该在规范3个字符,但不能完全确定...

/^(?:(Sun|Mon|Tue|Wed|Thu|Fri|Sat),\s+)?(0[1-9]|[1-2]?[0-9]|3[01])\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(19[0-9]{2}|[2-9][0-9]{3})\s+(2[0-3]|[0-1][0-9]):([0-5][0-9])(?::(60|[0-5][0-9]))?\s+([-\+][0-9]{2}[0-5][0-9]|(?:UT|GMT|(?:E|C|M|P)(?:ST|DT)|[A-IK-Z]))(\s+|\(([^\(\)]+|\\\(|\\\))*\))*$/ 
+0

您的时区规范不完整。例如,我的时区是EET,这不包括在内。我会出去接受任何三个或四个字母,而不是试图构建一个完整的列表。 – tripleee 2012-02-19 21:07:12

+0

@tripleee所以为此,我需要将'(?:ST | DT)'更改为'(?:ST | ET | DT)' – MrJ 2012-02-20 08:32:48

+0

就像我写的那样,这很可能还不完全。我的回忆是,即使最后一封信是T,也不能依赖,但是我调查了这封信很长一段时间。由ITYM'[DES] T',但我会重复,我不认为这就足够了。另请参阅http://en.wikipedia.org/wiki/Lists_of_time_zones – tripleee 2012-02-20 13:40:20

回答

0

正如@tripleee指出的那样,RFC2822的日期总是英文。但是,如果你从一个不严格遵循RFC2822的源并且可能使用不同语言的源解析日期,那么你必须识别可能使用的语言集合,并且制作一个匹配任何月份/日期的正则表达式的任何这些语言的星期名称。之后,您可以使用散列将捕获的每周/每周星期名称转换为您要使用的内部表示形式。

+0

RFC2822始终是英语。有些供应商错误地偏离了,但这是规格。 – tripleee 2012-02-19 19:56:20

+0

编程语言是PHP – MrJ 2012-02-19 20:41:19

+0

@tripleee规范说它将永远是英语?那么这是有趣的:) – MrJ 2012-02-19 20:42:29