Javascript regexp exec不';行不通

Javascript regexp exec不';行不通,javascript,regex,Javascript,Regex,最近我在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 !

最近我在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;
}
问题是它在
myArray
中返回一个
null


因为我是JS新手,所以无法解决这个问题。我做错了什么?

我更改了exec调用,如下所示:
var myArray=(/^(?=\d)((\d+)(h:)?\s*(\d+)m?$/g)

成功了!有人能解释一下区别吗?

问题就在这里

new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
通过构造函数创建新的正则表达式时,提供字符串。在字符串文字中,反斜杠字符(
\
)表示“转义下一个字符”

你必须避开那些反斜杠,这样它们就不会避开后面的角色。因此,正确的版本是:

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

有关JavaScript中转义字符的更多信息,请参阅。

问题在这一行:

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

var re = new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");
请注意,您还可以执行以下操作:

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

value
变量的值张贴到它可以是
{“11h20m”、“11h”、“20”、“20m”、“11:20”中的一个
应该
(?=\d)
做什么?有
x(?=y)
,这意味着
仅当x后跟y时才与x匹配,但是您错过了前面的值。@zeroflagL这意味着sting必须以开头digit@StNickolas您已经有
\d+
(一个或多个数字)作为第一个值,因此它必须以数字开头。初始化错误,try:
var re=new RegExp(/^(?=\d)((\d+)(h:)?\s*(\d+)?$/g)
。JavaScript字符串转义“\”符号,这就是为什么您初始化了完全不同的
RegExp