繁体   English   中英

正则表达式以验证时间

[英]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" 这不会返回AMPM 似乎也只有一组。 如何在小组中获得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)?/;

(我还更改了名称, RegexpRegExp太近了。)

现场示例:

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM