8

Ruby では、24092008 の形式で日付を解析しています。各セクション (年、月、日) を数値に変換したいと考えています。

整数コンストラクターに渡す 3 つの文字列を生成する正規表現を使用してそれらを分割しました。

  date =~ /^([\d]{2})([\d]{2})([\d]{4})/
  year = Integer($3)
  month = Integer($2)
  day = Integer($1)

月のラインに達すると、次のようにクラッシュします。

`Integer': invalid value for Integer: "09" (ArgumentError)

先頭のゼロを 8 進数として解釈しており、09 が有効な 8 進数ではないことに気付くまでに少し時間がかかりました (「07」でも問題なく動作します)。

これに対するエレガントな解決策はありますか、それとも 10 未満の数値をテストして最初にゼロを削除する必要がありますか?

ありがとう。

4

4 に答える 4

15

私は正規表現に慣れていないので、この答えが根拠がない場合はご容赦ください。$3、$2、および $1 は文字列であると想定しています。問題を再現するためにIRBで行ったことは次のとおりです。

irb(main):003:0> Integer("04")
=> 4
irb(main):004:0> Integer("09")
ArgumentError: invalid value for Integer: "09"
    from (irb):4:in `Integer'
    from (irb):4
    from :0

しかし、.to_i には同じ問題がないようです。

irb(main):005:0> "04".to_i
=> 4
irb(main):006:0> "09".to_i
=> 9
于 2008-09-28T20:36:02.363 に答える
1

おそらく(0([\d])|([1-9][\d]))代わり([\d]{2}) に $1、$2、$3 の代わりに $2、$4、および $5 を使用する必要があるかもしれません。

または、正規表現がサポートしている(?:...)場合は使用します(?:0([\d])|([1-9][\d]))

ruby は perl から正規表現を取得するため、この後者のバージョンが機能するはずです。

于 2008-09-28T20:52:03.370 に答える