You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对字符串中的数字执行减1操作并保留原分隔符

解决数字字符串批量减1并保留格式的问题

你写的代码确实正确提取并处理了数字,但核心问题出在最后一步——then { hours }直接返回了原字符串,完全没把修改后的数字替换回去,所以结果毫无变化。

最优解法:用gsub直接替换匹配的数字

Ruby的String#gsub方法支持传入代码块,能对每个匹配到的内容执行逻辑并替换,完美适配你的需求:既处理数字,又自动保留分隔符的位置:

def reduce_hours(hours)
  hours.gsub(/\d+/) { |num_str| num_str.to_i - 1 }
end

hours = '3,7-17,21'
puts reduce_hours(hours) # 输出:2,6-16,20

基于原代码的调整思路

如果想沿用你最初的提取数字逻辑,需要把处理后的数字数组替换回原字符串,不过这种方式不如gsub直接处理高效:

def reduce_hours(hours)
  # 提取所有数字并减1
  processed_numbers = hours.scan(/\d+/).map { |n| n.to_i - 1 }
  # 逐个替换原字符串中的数字
  hours.gsub(/\d+/) { processed_numbers.shift }
end

原理说明

  • /\d+/正则能匹配所有连续的数字字符
  • gsub会遍历字符串中每一个匹配项,执行块内代码将数字转成整数减1,再替换回原位置
  • 逗号、连字符这类分隔符因为不匹配正则,会被原样保留

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:42:23