更改我的日期时间正则表达式以使输入秒可选

时间:2013-01-23 09:18:30

标签: javascript regex

我正在尝试编写一个正则表达式,用于在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/

2 个答案:

答案 0 :(得分: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 - 比较这两个演示:

答案 1 :(得分: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