2011-07-19 34 views
3

我有一个字符串,其中包含具有很多格式可能性的日期。我的正则表达式匹配它变得荒谬而漫长。我希望学习更简洁的表达方式。这里有各种格式。我想获得每个日期作为自己的比赛:用于Google Calendar API日期输出的正则表达式

Sat Jul 16, 2011 
Sat Jul 16, 2011 6pm to 8pm 
Sat Jul 16, 2011 6pm to 8:30pm 
Sat Jul 16, 2011 6:30pm to 8pm 
Sat Jul 16, 2011 6:30pm to 8:30pm 

Sat Jul 16, 2011 to Sun Jul 17, 2011 
Sat Jul 16, 2011 6pm to Sun Jul 17, 2011 8pm 
Sat Jul 16, 2011 6:30pm to Sun Jul 17, 2011 8pm 
Sat Jul 16, 2011 6pm to Sun Jul 17, 2011 8:30pm 
Sat Jul 16, 2011 6:30pm to Sun Jul 17, 2011 8:30pm 

我来这里之前要问,我已经到了这一点:

([A-Z]{1}[a-z]{2} [A-Z]{1}[a-z]{2} [0-9]{1,2}, [0-4]{4} [0-9]{1,2}[ap]{1}m)(to ([A-Z]{1}[a-z]{2} [A-Z]{1}[a-z]{2} [0-9]{1,2}, [0-4]{4} [0-9]{1,2}[ap]{1}m))? 

这将返回的第一次约会,和第二个如果存在,但仅限于此格式:Sat Jul 16, 2011 6pm to Sun Jul 17, 2011 8pm。这太荒唐了。

编辑:

Someone suggested我检查的日期“到”部分,并在每边运行正则表达式,而不是试图在一次占所有案件。仍然在为它的每一面寻找更简洁的解决方案,但这会有很大帮助。

+0

那么我首先会摆脱所有的{1},但就是这样。其实如果你想验证日期,你的正则表达式会更长。重新验证验证永远不会很漂亮。对于这个建议,最简单的方法是编写一个匹配'm到[AZ]'和'm $'的if语句正则表达式,如果存在的话使用2日期匹配器,如果你不能匹配使用1侧匹配器。 – NorthGuard

回答

2

按照建议将日期分成两部分,然后使用date.js解析两部分。然后就像Date.parse一样简单('2011年7月16日星期六下午6:30')

+0

对于像“2011年7月16日星期六下午6:30到8:30”这样的范围,您可以解析上半部分,将第二部分拆分为冒号,然后使用Date.setHours()和Date.setMinutes()原始值获取第二个Date对象 – bwest

+0

完美。感谢品牌。 – hookedonwinter