我有下一种格式的输入字符串: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
。
我的正则表达式中的错误在哪里?如何返回预期的数组。
由于
答案 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。