如何在Ruby中实现按指定次数重复字符串中的字符?
如何在Ruby中将"A3B2C3D4"转换为"AAABBCCCDDDD"?
嘿,这个需求在Ruby里处理起来超顺手的,我给你分享几个实用的实现方式,你可以根据自己的场景选:
方法一:正则匹配 + Map拼接(最常用)
Ruby的正则表达式能轻松捕获每个字母和后面跟着的数字,再配合字符串重复方法就能快速搞定:
input = "A3B2C3D4" result = input.scan(/([A-Z])(\d)/).map { |char, num| char * num.to_i }.join puts result # 输出 AAABBCCCDDDD
给你拆解下:
scan(/([A-Z])(\d)/)会把原字符串拆成一个个包含字母和对应数字的子数组,比如[["A","3"], ["B","2"], ["C","3"], ["D","4"]]map遍历每个子数组,把字母重复数字指定的次数(注意要把字符串数字转成整数)- 最后用
join把所有重复后的片段拼接成完整字符串
方法二:逐个字符遍历(适合精细控制)
如果需要更灵活的逻辑(比如中途加一些额外处理),可以手动遍历每个字符:
input = "A3B2C3D4" result = [] current_char = nil input.each_char do |c| if c.match?(/[A-Z]/) current_char = c # 遇到字母就先存起来 else result << current_char * c.to_i # 遇到数字就把存好的字母重复对应次数,加入结果数组 end end puts result.join # 输出 AAABBCCCDDDD
用数组存结果片段比直接拼接字符串更高效,尤其是处理长字符串的时候。
方法三:一行搞定的GSUB写法
想追求代码简洁?用gsub直接替换就行,一行代码搞定:
input = "A3B2C3D4" result = input.gsub(/([A-Z])(\d)/) { $1 * $2.to_i } puts result
这里gsub会找到所有符合字母+数字的匹配项,然后用块里的结果替换它们——$1代表捕获到的字母,$2是捕获到的数字,转成整数后重复字母即可。
额外小提示
如果你的输入里包含小写字母,把正则里的[A-Z]改成[A-Za-z]就行;要是数字可能是多位数(比如"A10B5"这种),把正则改成([A-Z])(\d+)就能匹配多个数字啦!
内容的提问来源于stack exchange,提问作者Bloomberg
相关产品推荐
相关产品推荐

