如何减少字符串中的数字

Tom*_*Tom 1 ruby

我有一串整数,可以用逗号、连字符或两者分隔。例如

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。它只是不会将这些更改返回到原始字符串。我对这个片段很熟悉吗?

Ste*_*fan 5

enum_for(:scan, ...), Regexp.last_match(0), then\xe2\x80\x93 你想太多了。

\n

您只需使用gsub它的前一个数字子字符串替换每个数字子字符串:

\n
str = \'3,7-17,21\'\n\nstr.gsub(/\\d+/) { |hour| hour.to_i - 1 }\n#=> "2,6-16,20"\n
Run Code Online (Sandbox Code Playgroud)\n

需要往返to_i,因为字符串不能直接递减。

\n

相反的方向更容易:(via String#succ

\n
"2,6-16,20".gsub(/\\d+/, &:succ)\n#=> "3,7-17,21"\n
Run Code Online (Sandbox Code Playgroud)\n