[英]Regular expression to validate time
我正在使用正则表达式"(?:[0-1]?[0-9]|[2][1-4]):[0-5]?[0-9]\\s?(?:AM|am|PM|pm)?"
验证时间。
var Regexp = new RegExp("(?:[0-1]?[0-9]|[2][1-4]):[0-5]?[0-9]\s?(?:AM|am|PM|pm)?");
if (Regexp.test(starttime)) {
var match = Regexp.exec(starttime);
if (match) {
s = match[0];
}
}
我的输入是"7:00 AM"
。 但是我的match[0]
仅返回"7.00"
。 这不会返回AM
或PM
。 似乎也只有一组。 如何在小组中获得AM / PM ?
主要问题是您正在使用字符串定义正则表达式,并在该字符串中使用\\s
。 字符串中的\\
是转义字符,因此正则表达式看不到\\s
,而只看到s
(因为"\\s" === "s"
,转义实际上不执行任何操作)。 您将需要\\\\s
。
但是使用文字语法要好得多:
var rex = /(?:[0-1]?[0-9]|[2][1-4]):[0-5]?[0-9]\s?(?:AM|am|PM|pm)?/;
(我还更改了名称, Regexp
与RegExp
太近了。)
现场示例:
var starttime = "7:00 AM"; var rex = /(?:[0-1]?[0-9]|[2][1-4]):[0-5]?[0-9]\\s?(?:AM|am|PM|pm)?/; if (rex.test(starttime)) { var match = rex.exec(starttime); if (match) { snippet.log(match[0]); } }
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
(?:)
定义一个非捕获组。 如果要捕获组,请删除?:
。
如果您希望s
包含"7:00 AM"
,则可以使用文字语法//
或用另一个斜杠( \\\\s
)转义\\s
。 请注意, match[0]
不是组而是完整匹配。
如果您要第一组-时间 , 第二 组- 上午/下午 -可以稍作修改 :
((?:[0-1]?[0-9]|[2][1-4]):[0-5]?[0-9])\\s?(AM|am|PM|pm)?
您遇到了转义序列问题,在正则表达式中\\s
变为s
。
但是,即使使用首选的文字语法解决了该问题,您仍然必须考虑几个极端情况。 24:00应该不是时间,而20:00应该是时间,因此将[1-4]
更改为[0-3]
。 其次, 23:00 AM
也没有意义, 13:00 PM
也没有意义。 要解决此问题,您应该将正则表达式分成两部分,以便匹配12小时或24小时时间。 第三,时间7:0 PM
也匹配,因为您有一个?
在您的第一分钟数字之后。 始终应该有两分钟的数字。
与使用正则表达式一样,制作测试用例! 这将帮助您查看正则表达式在哪里出错(或没有出错)。
可使用的正则表达式:(感谢TJ Crowder的出色摘录工具)
var tests = ["20:00", "24:00", "13:00 PM", "7:0 AM", "7:00 AM"]; var regex12hrTime = /((0?[0-9])|(1[0-2])):[0-5][0-9]\\s?(AM|am|PM|pm)/; var regex24hrTime = /([0-1][0-9]|2[0-3]):[0-5][0-9]/; for (var idx=0; idx<tests.length; idx++) { var test = tests[idx]; if (regex12hrTime.test(test)) { snippet.log(test + " matches with " + regex12hrTime.exec(test)[0]); } else if (regex24hrTime.test(test)) { snippet.log(test + " matches with " + regex24hrTime.exec(test)[0]); } else { snippet.log(test + " does not match"); } }
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.