我正在使用正则表达式
"(?:[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 ?
答案 0 :(得分:2)
主要问题是您使用字符串来定义正则表达式,并在该字符串中使用\s
。字符串中的\
是一个转义字符,因此正则表达式看不到\s
,只看到s
(因为"\s" === "s"
,转义没有&#39}。实际上做任何事情)。您需要\\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>
&#13;
答案 1 :(得分:0)
(?:)
定义了一个非捕获组。如果要捕获组,请删除?:
。
如果您希望s
包含"7:00 AM"
,您可以使用文字语法//
或使用另一个斜杠(\s
)转义\\s
。请注意,match[0]
不是群组,而是完全匹配。
如果你想要第一组 - 时间和第二组 - 上午/下午 - this slight modification will do:
((?:[0-1]?[0-9]|[2][1-4]):[0-5]?[0-9])\s?(AM|am|PM|pm)?
答案 2 :(得分:0)
您有一个转义序列问题,正则表达式中\s
变为s
。
但是,即使您使用首选literal syntax来解决该问题,您仍然需要考虑几个边缘情况。 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");
}
}
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;