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

时间:2020-03-06 14:51:06  来源:igfitidea点击:

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

我已经使用正则表达式将它们拆分,该正则表达式生成了三个要传递给Integer构造函数的字符串。

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

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

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

我花了一段时间才意识到,它会将前导零解释为八进制,而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

此外,我们正在使用正则表达式对输入进行标记化。解析(分配语义)是在Ruby中完成的。

也许用(([\ d] {2})代替((0([\ d])|([1-9] [\ d])))`。
我们可能必须使用$ 2,$ 4和$ 5来代替$ 1,$ 2,$ 3.

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

由于ruby从perl中获取了正则表达式,因此后一个版本应该可以使用。