2013-02-21 343 views
1

我有这样的检查,如果基于日期是有效的W3 specificationW3CDTF规范正则表达式验证日期

/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/ 

以下格式接受:

Year: 
     YYYY (eg 1997) 
    Year and month: 
     YYYY-MM (eg 1997-07) 
    Complete date: 
     YYYY-MM-DD (eg 1997-07-16) 
    Complete date plus hours and minutes: 
     YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00) 
    Complete date plus hours, minutes and seconds: 
     YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00) 
    Complete date plus hours, minutes, seconds and a decimal fraction of a 
second 
     YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) 

2005-04-05永远不匹配和我不能为我的生活弄明白。根据模式,它应该匹配。

+3

现在你的匹配需要T和时间信息,它不是可选的 – Matthew 2013-02-21 15:49:07

回答

2

想想有一个或类型的方法构建本了,再看看身后一看就简化,如果你想:

(\d{4})|(\d{4}-\d{2})|(\d{4}-\d{2}-\d{2})|(\d{4}-\d{2}-\d{2}T\d{2}(:\d{2}){1,2}[-+]\d{2}:\d{2}) 

而且,这是不检查的日期有效的数字可以很做如果你模块化它会一步一步地轻松完成。约会的一个例子可能看起来像:

\d{4}-(([0]{0,1}[\d])|(1[0-2]))-(([0-2]{0,1}[\d])|(3[01])) 

注意这是假定只有4位数的年份,任何四位数年份是OK。它也允许01和1为单位数的月份和日期数字。为了清晰起见,还需要额外的包围。