7

我对正则表达式不是很好。我有以下时间:12:00am

我需要一个尊重这种格式的 Javascript 正则表达式:hh:mm[am/pm]

var regex = /^(\d\d):(\d\d)\s?(?:AM|PM)?$/;
4

4 回答 4

9

您几乎完成了,缺少的部分是十位数,小时数永远不会大于 1,分钟数永远不会大于 5。我还在末尾添加了“忽略大小写”标志,它接受“am”、“AM”、“Am”、“aM”:

var regex = /^([0-1]\d):([0-5]\d)\s?(?:AM|PM)?$/i;

更严格一点(1 ≤ 小时 ≤ 12):

/^([1-9]|1[0-2]):([0-5]\d)\s?(AM|PM)?$/i

文档:http ://www.javascriptkit.com/javatutors/redev.shtml 。

于 2013-09-10T09:48:34.337 回答
4

下面的正则表达式应该可以工作。演示小提琴

var regex = /^([0]\d|[1][0-2]):([0-5]\d)\s?(?:AM|PM)$/i;
/* The below lines are just for demo testing purpose */
var timeStr = ["13:59am","11:59AM","09:69PM", "09:24pm", "09:99pm", "15:23bm", "09:23 AM", "14:74 PM"];
for (i=0; i<timeStr.length; i++)
    console.log("Time String: "+timeStr[i]+ " Result: " +regex.test(timeStr[i]));

正则表达式解释:

([0]\d|[1][0-2])- 用了几个小时。0后跟任何单个数字(或)后跟1任何单个数字0-2(即 0 或 1 或 2)。这是为了确保小时值(如 13 或 14 等)被视为无效(由于我们使用 AM/PM 格式的时间,因此小时值最多只能为 12)。

([0-5]\d)- 几分钟。之间的任何单个数字0-5后跟 之间的另一个单个数字0-9。这是为了确保将 64、79 等分钟值视为无效。

\s?- 0 或 1 个空格

(?:AM|PM)$/i- 不区分大小写的 AM 或 PM(即am | pm | Am | Pm | aM | pM | AM | PM

控制台输出:

时间字符串:上午 13:59 结果:假
时间字符串:上午 11:59 结果:真
时间字符串:09:69PM 结果:假
时间字符串:09:24pm 结果:真
时间字符串:晚上 9:99 结果:假
时间字符串:15:23bm 结果:假
时间字符串:09:23 AM 结果:真
时间字符串:下午 14:74 结果:假  
于 2013-09-10T10:04:42.990 回答
2

以下作品我使用 RegExr http://www.regexr.com/3btsp对其进行了测试

/^([0]?[1-9]|1[0-2]):([0-5]\d)\s?(AM|PM)$/i

于 2015-10-05T03:50:38.450 回答
0
^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$
于 2015-10-04T19:14:15.463 回答