9

Javascriptを使用して、ユーザー入力文字列を期間(秒単位)で解析しようとしています。

対処できるようにしたい入力の例を次に示します。

  • 「1時間2分」
  • 「1日2時間3分」
  • 「1日2時間37分」
  • 「1日2分」
  • 「3日20時間」

主な構成要素は 1) 日、2) 時間、3) 分ですが、一部の構成要素は常に含まれているとは限りません。

私の攻撃計画は、.match と正規表現を使用することです。単語の最初の文字を取得できる限り、前の数字が何を表しているかがわかり、単語のさまざまな形式 (例: 時間、時間、時間、時間) をすべて処理できます。しかし、正規表現を学んでいるので、思ったよりも複雑であることがわかりました。

どんな助けや提案も大歓迎です!

4

5 に答える 5

15

文字列の日/時間/分の順序は保証されていますか? そうでない場合は、それぞれに対して個別の 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;
}
于 2012-08-10T21:36:46.503 に答える
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 つ) が必要です。

于 2012-08-10T21:48:37.190 に答える
1

正規表現でオプションのサブストリングを使用して、説明する任意の組み合わせに一致させることができます。

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

これには少なくとも、、が必要dですがhm一般的な短縮を受け入れます。

于 2012-08-10T21:28:21.800 に答える
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; 
});

ここでは、replace を使用して文字列を変更するのではなく、一致を 1 つずつ処理します。日、時間、分は順不同であることに注意してください。

于 2012-08-10T22:08:13.707 に答える