验证格式化的“时间”

时间:2014-05-15 19:42:59

标签: javascript regex

我想验证严格格式化的“时间”。这个“时间”具有以下形式:

\d+d \d+h \d+m

其中“d”表示天,“h”表示小时,“m”表示分钟,每个数字的最小值为“1”。主要关注的是每个子字符串可能存在也可能不存在,但总会存在至少一个。此外,它们必须按照上面指定的顺序。

我的以下RegEx是验证格式的最佳方式吗? RegEx是简洁性和速度之间的最佳平衡吗?

(?=.+)^(?:(?:[1-9]|[1-9][0-9]+)d\s?)?(?:(?:[1-9]|1[0-9]|2[0-3])h\s?)?(?:(?:[1-9]|[1-5][0-9])m)?$

我已经包含了前瞻以确保空字符串不匹配。

我看到的唯一一个小问题是,如果没有正在进行的“m”值,“23h”之类的东西会匹配。 “d”也是如此。

1 个答案:

答案 0 :(得分:1)

这是一个优化模式,严格检查您描述的格式:

^(?=\S)(?:[1-9][0-9]*d)?(?:(?:^| )(?:1[0-9]?|[3-9]|2[0-3]?)h)?(?:(?:^| )(?:[1-5][0-9]?|[6-9])m)?$

详细说明:

(?=\S)确保模式中至少有一个组,并强制字符串不以空格开头。 (请注意,您只需找到一个字符)

[1-9][0-9]*d(?:[1-9]|[1-9][0-9]+)d快,因为角色类[1-9]只测试过一次。

(?:1[0-9]?|[3-9]|2[0-3]?)(?:[1-9]|1[0-9]|2[0-3])略长,但效率更高,因为第一个数字只测试一次。替代品按概率排序(第一个为11/22,第二个为7/22,最后一个为4/22)

[1-5][0-9]?|[6-9]也一样。

我假设组必须用空格分隔。为了确保这一点,我在第1组和第2组的末尾删除了\s?,将(?:^| )放在第2组和第3组的开头。只有两种可能性:该组正处于开始阶段或者之前有一个其他组和一个空格(记住,由于前瞻,你不能有空格而没有组)

您可以获得更长的图案(一个字符),但速度更快,更具约束力。如果你需要一个模糊的理由来减小模式的大小,你可以使用旧的子模式获得3个字符,用于组2和组3中的数字。