如何从可能具有前导零的字符串中解析数字?

在ruby中,我使用以下格式解析日期:24092008.我想将每个部分(年,月,日)转换为数字。

我使用正则表达式将它们拆分,它产生三个字符串,我将它传递给Integer构造函数。

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

当它达到月线时,崩溃如下:

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

我花了一段时间才意识到它正在解释前导零,因为Octal和09不是有效的八进制数(它与“07”一起工作正常)。

有没有一个优雅的解决方案,或者我应该测试小于10的数字并首先删除零?

谢谢。

我不熟悉正则表达式,所以如果这个答案偏离基础,请原谅我。 我一直认为$ 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 

指定基数10

明确告诉Ruby您要将字符串解释为基数为10的数字。

 Integer("09", 10) # => 9 

如果你想要严格,.to_i更好

 "123abc".to_i # => 123 Integer("123abc", 10) # => ArgumentError 

我怎么想出来的

irbmethod(:Integer)返回# 。 那告诉我Kernel拥有这个方法,我查阅了内核上的文档。 方法签名显示它将base作为第二个参数。

也许(0([\d])|([1-9][\d]))代替([\d]{2})你可能不得不用$ 2,$ 4和$ 5代替$ 1, 2美元,3美元。

或者如果你的正则表达式支持(?:...)然后使用(?:0([\d])|([1-9][\d]))

由于ruby从perl获取其正则表达式,因此后一版本应该可行。

此外,您正在使用正则表达式来标记输入。 解析(分配语义)在Ruby中完成。