0

期間 (時間、分、またはその両方の任意の組み合わせ) を表すテキストを含む CSV ファイルを解析しています。例えば:

  1. 「1時間30分」
  2. "2時間"
  3. "45分"

私はこれを行うことができるようにしたい:duration = h.hours + m.minutesそして、それhが時間 (存在する場合) であり、 についても同じであることを確認しmます。

この正規表現/(\d*)\s?hour\D*(\d*)\s?min/)でこれを解決しようとしましたが、これは分だけ、または時間だけを検出しません。

だから私はこれに変更しました/(\d+)\s?\D*\s?(\d*)/が、値が時間か分かを判断する方法がないため、これも間違っているので、またはに変換できhourますminutes

アプリでこの問題を解決できる方法について混乱しています。正規表現、ハッシュ、マッチング、またはその他の方法ですか? ヘルプやアドバイスをいただければ幸いです。

4

3 に答える 3

4

ここに1つの派手な方法があります:

def string_to_duration(string)
  string.downcase.scan(/(\d+)\s+(hours?|minutes?)/).map do |number, unit|
    number.to_i.send(unit)
  end.reduce(:+)
end

テスト:

require "active_support/all"

input = [
  "1 hour 30 minutes",
  "2 hours",
  "45 minutes"
]

def string_to_duration(string)
  string.downcase.scan(/(\d+)\s+(hours?|minutes?)/).map do |number, unit|
    number.to_i.send(unit)
  end.reduce(:+)
end

input.each do |str|
  puts string_to_duration str
end

出力:

5400
7200
2700

"1 minute 1 minute 1 minute"注: これは、 will printのように重複したユニットも受け入れます180

于 2013-06-10T11:59:35.553 に答える
1

文字列に少なくとも 1 つ存在することがわかっている場合、正規表現と一致させるのは非常に簡単です。例えば:

(?:(\d+)\s*hours?)?\s*(?:(\d+)\s*minutes?)?
于 2013-06-10T11:52:57.960 に答える
0

これが私がすることであり、それが最も簡単な方法だと思います:

str = "1 hour 30 minutes"
h = str[/(\d+) hour/, 1].to_i rescue 0
m = str[/(\d+) minute/, 1].to_i rescue 0
于 2013-06-11T01:36:38.387 に答える