Javascript regexp exec不起作用

时间:2013-04-26 10:18:21

标签: javascript regex

最近我通过JS中的正则表达式发布了a question关于时间格式转换的内容。

现在我修改了一下代码。

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;
}

问题是它在null中返回myArray值。

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

3 个答案:

答案 0 :(得分:1)

问题出在这里

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

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

你必须逃避那些反斜杠,所以他们不会逃避他们后续的角色。所以正确的版本是:

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

有关在JavaScript中转义字符的详细信息,请参阅this article on values, variables, and literals from MDN

答案 1 :(得分:1)

问题出在这一行:

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

请理解RegExp class将String作为构造的参数,您需要双重转义\d\s才能被RegEx引擎正确解释,因此\d应该成为\\d \s\\s应该在你的正则表达式字符串中成为var re = new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g"); ,如下所示:

var re = /^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g;

请注意,您也可以这样做:

{{1}}

答案 2 :(得分:0)

我改变了这样的exec调用: var myArray = (/^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g).exec(value);

它有效!任何人都可以解释这种差异吗?