用于验证时间的正则表达式

Regular expression to validate time

本文关键字:正则表达式 时间 验证 用于      更新时间:2023-09-26

我正在使用正则表达式"(?:[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。字符串中的'是一个转义符,所以regex看不到'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也没有意义。要解决此问题,您应该将regex分为两部分,以便匹配12小时时间或24小时时间。第三,时间7:0 PM也匹配,因为在第一个分钟数字之后有一个?。应该始终有两个分钟数字。

与regex一样,制作测试用例!这将帮助您了解正则表达式哪里出了问题(或没有出问题)。

工作正则表达式:(感谢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>