匹配加入AmPm小时与正则表达式

时间:2017-05-25 09:15:57

标签: javascript regex string typescript

我有下一种格式的输入字符串:12:00am|1:20PM|9:30Pm

我需要输入数小时的数组,如:[12:00am, 1:20PM, 9:30Pm]

但是在我与正则表达式匹配之前。

我有一些正则表达式匹配AmPm小时,我尝试添加|以匹配完整字符串 \b((1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm]))([|])?。此正则表达式匹配字符串12:00am|1:20PM|9:30Pm,但也匹配不正确的字符串12:00am|1:20PM}9:30Pm

我的正则表达式中的错误在哪里?如何返回预期的数组。

由于

1 个答案:

答案 0 :(得分:1)

\b((1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm]))([|])?不需要|,因为[|]?匹配此char的1或0次匹配。此正则表达式匹配12:00am|1:20PM}9:30Pm,因为它找到12:00am并将其称为一天(即返回有效匹配)。

您需要使用|拆分字符串,并针对/^(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm])$/模式验证每个项目。

var s = "12:00am|1:20PM|9:30Pm";
var re = /^(1[0-2]|0?[1-9]):[0-5][0-9]([AaPp][Mm])$/;
var items = s.split("|");
if (items.filter(function(x) { return re.test(x); }).length === items.length) {
   console.log("VALID => ", items);
} else {
	console.log("INVALID!");
}

请注意,您可以使用正则表达式预先验证字符串,但这只是更麻烦:

var s = "12:00am|1:20PM|9:30Pm";
var re_block = "(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm])";
var re = new RegExp("^" + re_block + "(?:\\|" + re_block + ")*$");
var isValid = re.test(s);
console.log(isValid ? s.split("|") : "Invalid!");

正则表达式看起来像/^(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm])(?:\|(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm]))*$/,它将验证以时间子字符串开头的字符串,然后在字符串结尾处出现0次或多次时间子字符串。请参阅pattern demo