2013-04-26 18 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;