1

最近发了一个关于在JS中通过正则表达式转换时间格式的问题。

现在我稍微修改了代码。

function getHours(value) {
  if (value == 0)
    return 0;
  var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
  var myArray = re.exec(value);
  var hours = 0;
  var minutes = 0;
  if (myArray != null) {
    if (myArray[2] != null) {
      hours = myArray[2];
    }
    if (myArray[5] != null) {
      minutes = myArray[5];
    }
  }
  return Number(hours) + Number(minutes) / 60;
}

问题是它返回一个nullmyArray

由于我是 JS 新手,我无法解决这个问题。我究竟做错了什么?

4

3 回答 3

2

问题就在这里

new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");

当您通过构造函数创建新的正则表达式时,您提供了字符串。在字符串文字中,反斜杠字符 ( \) 表示“转义下一个字符”。

您必须转义这些反斜杠,这样它们就不会转义其后续字符。所以正确的版本是:

new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");

有关在 JavaScript 中转义字符的更多信息,请参阅来自 MDN 的有关值、变量和文字的这篇文章。

于 2013-04-26T10:36:10.657 回答
1

问题出在这一行:

var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");

请理解,RegExp class将字符串作为参数来构造,并且您需要双重转义\d并由正则表达式\s引擎正确解释,因此\d应该成为\\d并且\s应该成为\\s您的正则表达式字符串,如下所示:

var re = new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");

请注意,您还可以执行以下操作:

var re = /^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g;
于 2013-04-26T10:36:57.630 回答
0

I changed exec call like this: var myArray = (/^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g).exec(value);

And it worked! Can anyone explain the difference?

于 2013-04-26T10:30:28.070 回答