2012-08-10 69 views
9

我想解析用戶輸入字符串的持續時間(以秒爲單位)與Javascript。如何用JavaScript解析持續時間字符串到秒?

這裏有一些,我想能夠處理例如輸入:

  • 「1小時,2分」
  • 「1天,2小時,3分」
  • 「1D 2H37米」
  • 「1天2分鐘」
  • 「3天20小時」

主要組成部分是1 )天,2)小時3)分鐘,但可能並不總是包含某些組件。

我的攻擊計劃是使用.match和regex。只要我能夠得到單詞的第一個字母,我就會知道前面的數字是什麼,並能夠處理所有不同格式的單詞(例如小時,小時,小時,小時)。然而,因爲我正在學習正則表達式,所以它比我想象的要複雜得多。

任何幫助或建議將不勝感激!

回答

11

字符串中的天/小時/分鐘的順序是否有保證?如果不是,那麼只需爲每個RegEx執行一次,可能會更容易。像這樣?

function getSeconds(str) { 
    var seconds = 0; 
    var days = str.match(/(\d+)\s*d/); 
    var hours = str.match(/(\d+)\s*h/); 
    var minutes = str.match(/(\d+)\s*m/); 
    if (days) { seconds += parseInt(days[1])*86400; } 
    if (hours) { seconds += parseInt(hours[1])*3600; } 
    if (minutes) { seconds += parseInt(minutes[1])*60; } 
    return seconds; 
} 
+0

這正是我正在尋找的。處理我扔到它的所有東西,非常乾淨。萬分感謝! – 2012-08-10 22:26:10

+0

如果沒有任何匹配,那麼返回NaN會不會更好,以避免歧義? – Dan 2013-09-01 13:53:32

1

您可以使用可選的子串的正則表達式來任意組合搭配爲你描述:

/(\d+)\s*d(ays?)?\s*(\d+)\s*h(ours?)?\s*(\d+)\s*m(in(utes?)?)?/ 

這至少需要一個dhm但接受普通酥油。

+0

即使不是所有的d,h和m都存在,它看起來好像他需要它工作。 – 2012-08-10 21:40:16

2

可以使用此代碼打破你字符串轉換成數字,然後是單元串:

function getPieces(str) { 
    var pieces = []; 
    var re = /(\d+)[\s,]*([a-zA-Z]+)/g, matches; 
    while (matches = re.exec(str)) { 
     pieces.push(+matches[1]); 
     pieces.push(matches[2]); 
    } 
    return(pieces); 
} 

然後函數返回一個陣列,例如["1","day","2","hours","3","minutes"]其中陣列中交替的項的值然後是單位的價值。

所以,對於字符串:

"1 day, 2 hours, 3 minutes" 

函數返回:

[1, "day", 2, "hours", 3, "minutes"] 

然後,你可以檢查每個值來決定如何處理它的單位。

這裏的工作演示和測試用例:http://jsfiddle.net/jfriend00/kT9qn/。該功能可以容忍可變數量的空白,並且在數字和單位標籤之間將佔用逗號,空格或兩者都不佔空格。它預期單位之後有空格或逗號(至少一個)。

+0

非常好____。 – some 2012-08-10 21:56:34

1
var str = "1 day, 2 hours, 3 minutes"; 

var seconds = 0; 
str.replace (/\s*,?(\d+)\s*(?:(d)(?:ays?)?|(h)(?:ours?)?|(m)(?:in(?:utes?)?)?)/g, function (m0, n, d, h, m) { 
    seconds += +n * (d ? 24 * 60 * 60 : h ? 60 * 60 : 60); 
    return m0; 
}); 

這裏我使用替換不是改變字符串,而是逐個處理匹配。注意天,小時數可以按任何順序。