2013-04-26 19 views
0

最近我发布了a question关于通过正则表达式在JS中进行时间格式转换。Javascript正则表达式执行不起作用

现在我修改了一下代码。

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

的问题是,它返回一个myArraynull

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

+1

发布value'变量的'价值也 – Ejaz 2013-04-26 10:22:37

+0

它可以'{ “11h20m”, “11H”, “20”, “20米” 之一, “11:20” }' – StNickolas 2013-04-26 10:25:24

+0

'(?= \ d)'应该做些什么?有'x(?= y)'这意味着'只有当x后面跟着y才匹配x,但是你错过了前面的值。 – zeroflagL 2013-04-26 10:29:21

回答

1

的问题是在这里

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

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

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

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

有关更多信息,请参见this article on values, variables, and literals from MDN在JavaScript的转义字符。

0

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

和它的工作!任何人都可以解释这个区别吗

+2

错误的初始化,尝试:'var re = new RegExp(/ ^(?= \ d)((\ d +)(h |:))?\ s *((\ d +)m?)$ $ g)' 。 JavaScript字符串转义“\”符号,这就是为什么您初始化完全不同的'RegExp'。 – 2013-04-26 10:35:40

1

问题是在这一行:

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

PLS明白RegExp class以一个String作为参数来构建,你需要加倍逃避\d\s由正则表达式引擎正确解释这样\d应该成为\\d\s应该成为\\s在你的正则表达式的字符串是这样的:

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

注意THA牛逼你也可以这样做:

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