2012-08-10 12 views
9

私はJavascriptを使ってユーザー入力文字列を(秒単位で)解析しています。Javascriptで継続時間文字列を秒単位で解析する方法は?

  • "1時間、2分"
  • "1日、2時間、3分"
  • :ここ

    は、私が対処できるようにしたいと思い、いくつかの例入力です"1D 2Hの37メートル"

  • "1日2分"
  • "3daysの20hours"

は、主要なコンポーネントは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

これはまさに私が探していたものです。私がそれに投げるすべてを扱い、非常にきれいです。ありがとう、トン! –

+0

は、まったく一致がない場合にNaNを返すほうが良くないと思いますが、曖昧さを解消するには? – Dan

1

あなたは、任意の組み合わせを一致させるために正規表現にオプションの部分文字列を使用することができます。これは、少なくともdhを必要とし、mをしかし、一般的なショートニングを受け入れ

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

+0

d、h、mのすべてが存在していなくても動作する必要があるようです。 –

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/です。この関数は、可変量の空白を許容し、桁と単位ラベルの間にコンマ、スペース、またはどちらも使用しません。ユニットの後にスペースまたはコンマ(少なくとも1つ)が必要です。

+0

非常にnice_______。 – some

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

ここでは、文字列を変更するのではなく、一致を1つずつ処理するために、置き換えを使用します。日数、時間は任意の順序にすることができます。

関連する問題