我有一串整数,可以用逗号、连字符或两者分隔。例如
str = '3,7-17,21'
Run Code Online (Sandbox Code Playgroud)
我需要将这些数字减 1,同时又不丢失它们在该字符串中的位置。
当我拆分时,我会丢失逗号和连字符,因此它们的位置会发生变化。
有没有一种好的方法可以将我的字符串变成2,6-16,20?
我开始执行以下操作,但最终陷入了困境:
def reduce_hours(hours)
hours
.enum_for(:scan, /\d+/)
.map { Regexp.last_match(0) }
.map(&:to_i)
.map { |hour| hour - 1 }
.then { hours }
end
hours = '3,7-17,21'
Run Code Online (Sandbox Code Playgroud)
它只是返回原始字符串。当我调试时,它确实会单独匹配数字并将它们减 1。它只是不会将这些更改返回到原始字符串。我对这个片段很熟悉吗?
enum_for(:scan, ...), Regexp.last_match(0), then\xe2\x80\x93 你想太多了。
您只需使用gsub它的前一个数字子字符串替换每个数字子字符串:
str = \'3,7-17,21\'\n\nstr.gsub(/\\d+/) { |hour| hour.to_i - 1 }\n#=> "2,6-16,20"\nRun Code Online (Sandbox Code Playgroud)\n需要往返to_i,因为字符串不能直接递减。
相反的方向更容易:(via String#succ)
"2,6-16,20".gsub(/\\d+/, &:succ)\n#=> "3,7-17,21"\nRun Code Online (Sandbox Code Playgroud)\n