如何解析可能有前导零的字符串中的数字?
时间: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中获取了正则表达式,因此后一个版本应该可以使用。