我有下一种格式的输入字符串: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
,这是不正确的。
我的正则表达式哪里出错了,我怎样才能返回预期的数组。
谢谢
最佳答案
\b((1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm]))([ |])?
不需要 |
因为 [|]?
匹配此字符的 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 .
关于javascript - 使用正则表达式匹配加入的 AmPm 小时数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44176727/