正则表达式以验证时间

时间:2015-12-22 14:00:33

标签: javascript regex

我正在使用正则表达式 "(?:[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

3 个答案:

答案 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;
&#13;
&#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提供了很棒的代码片段工具)

&#13;
&#13;
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;
&#13;
&#13;