Ruby 2.7中替换字符串内第二个整数的最简方法
Ruby 2.7 替换字符串内第二个整数的最简实现
针对每个字符串固定包含两个整数的场景,直接用String#sub配合精简正则是最简洁、性能也最好的实现,比全量匹配的gsub更适配这个需求,不需要做多余的字符串拆分拼接。
最简写法可以直接用下面的正则,不需要额外写捕获组回填:
# 示例:把第二个整数替换为目标值,比如100 s1 = 'We are there from 2 to 5 oclock' s1.sub(/\d+\D+\K\d+/, '100') # => "We are there from 2 to 100 oclock" s2 = 'You can stack 15 onto 22 boxes' s2.sub(/\d+\D+\K\d+/, '99') # => "You can stack 15 onto 99 boxes"
这个写法的几个关键点:
- 用
sub而非gsub:因为只需要替换一次匹配结果,不需要全局扫描字符串,执行效率更高 - 正则中的
\K是Ruby原生正则支持的元字符,作用是将它之前匹配到的内容(第一个整数+中间的非数字间隔内容)从最终替换匹配段中丢弃,不用手动写捕获组把前半段拼回去,代码更短 - 只要字符串里的整数是按先后顺序出现、两个整数中间没有其他零散数字,这个写法就能稳定工作,完全覆盖你给出的示例场景。
如果需要对第二个整数做动态计算(比如加减、翻倍,而非替换成固定值),给sub传代码块即可,写法同样简洁:
# 示例:把第二个整数翻倍 s1 = 'We are there from 2 to 5 oclock' s1.sub(/(\d+)(\D+)(\d+)/) { "#{$1}#{$2}#{$3.to_i * 2}" } # => "We are there from 2 to 10 oclock"
不推荐的冗余实现:
- 用
gsub加计数器判断替换位置:会扫描整个字符串的所有数字匹配项,在只需要替换第二个整数的场景下属于多余操作 - 把字符串按数字split成数组再拼接:代码行数多,还要处理分段拼接的边界问题,可读性和维护性都不如正则sub的写法。
内容的提问来源于stack exchange,提问作者LinFelix
相关产品推荐
相关产品推荐

