2

我正在尝试编写一个正则表达式,用于 javascript 函数,以测试日期时间。

我只想允许以下格式的日期:

YYYY-MM-DD HH:mm:ss
YYYY-MM-DDTHH:mm:ss
YYYY-MM-DD HH:mm
YYYY-MM-DDTHH:mm

这是我迄今为止设法做到的:

/^(19[0-9]{2}|2[0-9]{3})-(0[1-9]|1[012])-([123]0|[012][1-9]|31)[ \/T\/t]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/

它做我想要的,除了需要小时、分钟和秒而不是小时和分钟,秒是可选的。

谢谢你的帮助!

我写了一个带有一些测试数据的小 jsFiddle,让你的生活更轻松。只需更新模式变量并运行它,表格就会匹配。

http://jsfiddle.net/smMJC/

4

2 回答 2

3

更新:我更新了这个答案,将 (...) 更改为 (?:...),这样您的捕获就不会被搞砸了。

试试这个:

/^(19[0-9]{2}|2[0-9]{3})-(0[1-9]|1[012])-([123]0|[012][1-9]|31)[ \/T\/t]([01][0-9]|2[0-3]):([0-5][0-9])(?::([0-5][0-9]))?$/

更新小提琴:http: //jsfiddle.net/smMJC/5/

我所做的是改变

:([0-5][0-9])

到:

(?::([0-5][0-9]))?

这意味着使该部分成为可选的。(双冒号是有意的,因为它在(?: ... )?外面是一个非捕获组,而在里面是一个文字“:”。

此外,您可能需要更改:

[ \/T\/t]

到:

[ Tt]

除非您真的想匹配以下字符串:

2013-01-01/15:30:30

用斜线代替 T - 比较这两个演示:

于 2013-01-23T09:22:03.237 回答
1

改变

  • [0-9]\d
  • 简化时间指示器[ t]并添加不区分大小写的修饰符/.../i
  • :([0-5]\d)到可选(?::([0-5]\d))?

正则表达式:

/^(19|2\d)\d\d-(0[1-9]|1[012])-([123]0|[012][1-9]|31)[ t]([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?$/i

JSFiddle

如果您不需要捕获日期时间字符串的各个部分

  • ()尽可能去掉括号
  • 在需要的地方()用非捕获替换括号(?:...)

正则表达式:

/^(?:19|2\d)\d\d-(?:0[1-9]|1[012])-(?:[123]0|[012][1-9]|31)[ t](?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$/i

JSFiddle

于 2013-01-23T09:59:52.510 回答