例如:2015-01-17T18:23:02+00:00正则表达式有一些问题,因为字符串的某些组件被认为是“有效”的,可能是推测的,可能不是必需的。此外,字符串可以被格式化为2015-01-17T18:23:02Z的事实也让我有点困惑。
2015-01-17T18:23:02+00:00
2015-01-17T18:23:02Z
gywdnpxw1#
根据我之前的回答,你可以这样做,而且非常严格:
^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:Z|[+-][01]\d:[0-5]\d)$
Debuggex Demo有点奇怪,但它检查有效日期,包括闰年(Proleptic Gregorian),适用于1000-9999年,检查无效时间,如25:30或21:94,以及最大UTC偏移+/-19:59(或Z)。(目前不会发生超过+14:00或-12:00的情况,但将来可能会发生)。完成:根据OP给出的示例,此答案仅支持ISO 8601标准的一个子集。这是一种扩展的表示法,在时间部分中使用秒,在UTC偏移中使用分钟。为简洁起见,它不支持省略破折号和冒号的基本表示法,也不支持序数日期(星期)或年-周-星期表示法。一个支持基本表示法、序数和省略秒/UTC偏移分钟的正则表达式的扩展版本生存期为here。
cfh9epnr2#
基于前面的answer,此正则表达式处理秒的小数。
^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,9})?(?:Z|[+-][01]\d:[0-5]\d)$
Debuggex Demo
gg58donl3#
在此链接中,我们可以看到基于我们希望包含的不同值的不同ISO 8601格式。对于问题中的示例2015-01-17T18:23:02+00:00,下面的regex应该可以工作。[0-9]{4}-[0-9]{2}-[0-9]{2}T([0-9]{2}:){2}[0-9]{2}[+|-][0-9]{2}:[0-9]{2}此处[+|-]表示可能的时区偏移量。
[0-9]{4}-[0-9]{2}-[0-9]{2}T([0-9]{2}:){2}[0-9]{2}[+|-][0-9]{2}:[0-9]{2}
[+|-]
n3h0vuf24#
如果您只想匹配时区,请使用以下命令:
^[+|-][0-1][0-9]:[0-5][0-9]$
最大值为+或- 19:59,这已足够
piok6c0g5#
^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]{3})?(Z)?$
日期时间。也包含选择性的毫秒。
dgtucam16#
如果使用regex不是强制性的,我认为在js中检测它的最好方法是这样做:
function isIso8601(value) { return new Date(value).toJSON() === value; } isIso8601('2019-08-21T16:35:05.073Z'); // true isIso8601('2013-99-99T04:13:00+00:00'); // false
uxh89sit7#
与日期和时区匹配
2019-07-01T24:15:00+19:00 \d{4}-[01]{1}\d{1}-[0-3]{1}\d{1}T[0-2]{1}\d{1}:[0-6]{1}\d{1}:[0-6]{1}\d{1}[+|-][0-1][0-9]:[0-5][0-9]$
在此测试https://regexr.com/4gmi2
7条答案
按热度按时间gywdnpxw1#
根据我之前的回答,你可以这样做,而且非常严格:
Debuggex Demo
有点奇怪,但它检查有效日期,包括闰年(Proleptic Gregorian),适用于1000-9999年,检查无效时间,如25:30或21:94,以及最大UTC偏移+/-19:59(或Z)。
(目前不会发生超过+14:00或-12:00的情况,但将来可能会发生)。
完成:根据OP给出的示例,此答案仅支持ISO 8601标准的一个子集。这是一种扩展的表示法,在时间部分中使用秒,在UTC偏移中使用分钟。为简洁起见,它不支持省略破折号和冒号的基本表示法,也不支持序数日期(星期)或年-周-星期表示法。
一个支持基本表示法、序数和省略秒/UTC偏移分钟的正则表达式的扩展版本生存期为here。
cfh9epnr2#
基于前面的answer,此正则表达式处理秒的小数。
Debuggex Demo
gg58donl3#
在此链接中,我们可以看到基于我们希望包含的不同值的不同ISO 8601格式。
对于问题中的示例
2015-01-17T18:23:02+00:00
,下面的regex应该可以工作。[0-9]{4}-[0-9]{2}-[0-9]{2}T([0-9]{2}:){2}[0-9]{2}[+|-][0-9]{2}:[0-9]{2}
此处
[+|-]
表示可能的时区偏移量。n3h0vuf24#
如果您只想匹配时区,请使用以下命令:
最大值为+或- 19:59,这已足够
piok6c0g5#
日期时间。也包含选择性的毫秒。
dgtucam16#
如果使用regex不是强制性的,我认为在js中检测它的最好方法是这样做:
uxh89sit7#
与日期和时区匹配
在此测试https://regexr.com/4gmi2