以下是开发解决方案时需要考虑的一些要点。
如果您的字符串是:
str = "ca9t00456"
期望的返回值是:
"ca9t00457"
(请注意,OP 的解决方案会"cat10"
为此字符串返回不正确的结果( .)
合理的第一步是将字符串分成两部分:
n = str.index(/\d+\z/)
#=> 4
prefix = str[0, n]
#=> "ca9t"
suffix = str[n..-1]
#=> "00456"
请参阅字符串#index。正则表达式 ,/\d+\z/
读作“匹配一个或多个 ( +
) 数字 ( \d
) 后跟字符串 ( \z
) 的结尾。该数字'9'
被跳过,因为它后面既没有数字也没有在字符串的末尾。请参阅另见字符串#[]。
我们返回的字符串将以 (保存的值) 开头prefix
,所以我们现在可以把它放在一边,专注于修改suffix
。
一种方法是:
((suffix.to_i) + 1).to_s
#=> "457"
但是我们必须添加正确数量的前导零。在这里,这与 (2) 中前导零的数量相同suffix
,但如果suffix
是,例如 ,00999
它将只有一个 ( 01000
)。可以这样做,但它很混乱。
正如@steenslag 在评论中建议的那样,更简单的方法是使用方法String#succ 。
new_suffix = suffix.succ
#=> "00457"
"00999".succ
#=> "01000"
现在我们只需要结合prefix
和new_suffix
。
注意如果我们succ
对整个字符串执行会发生什么:
"ca9t0456".succ
#=> "ca9t0457" correct
"ca9t0999".succ
#=> "ca9t1000" correct
"ca9t9999".succ
#=> "ca9u0000" incorrect
如您所见,第三个示例存在问题。这就是为什么我选择将字符串分成两部分作为第一步。
您需要调查其他三个案例。第一种是当前缀是空字符串时:
str = "00456"
第二个是后缀为空字符串时:
str = "ca9t"
第三个是字符串为空时:
str = ""
您可以检查之前的计算在第一种情况下是否仍然有效。
在第二种情况下,我们会发现:
n = str.index(/\d+\z/)
#=> "cat9t".index(/\d+\z/) => nil
的nil
值n
告诉我们期望的返回值是:
str + "1"
#=> "ca9t" + "1" => "ca9t1"
那行得通吗?