Ruby如何实现将字符串中的占位符替换为数组或哈希对应的取值
Ruby 字符串占位符替换实现指南
原代码失效原因
你的代码存在两个核心问题:
String#gsub是不可变方法,仅返回替换后的新字符串,不会修改原变量,循环中没有接收返回值的话所有替换操作都不会生效- 每次循环会全量替换所有匹配到的
{{xxx}}占位符,最终所有占位符都会被覆盖为数组最后一个元素,无法实现按顺序/按映射替换的效果
实现方案
方案1:数组按顺序替换
如果确定占位符出现顺序和数组元素顺序完全对应,可以用计数器配合gsub的块语法实现:
# 原始输入 input_str = "The dimension of the square is {{width}} and {{length}}" substitute_values = [10, 20] index = 0 result = input_str.gsub(/\{\{.*?\}\}/) do substitute_values[index].tap { index += 1 } end puts result # 输出:The dimension of the square is 10 and 20
方案2:哈希映射替换(更推荐)
你提到的哈希映射方案确实可行性更高,不受占位符顺序影响,维护性更强,Ruby的gsub原生支持传入哈希作为替换映射表,实现非常简单:
# 原始输入 input_str = "The dimension of the square is {{width}} and {{length}}" # 构造占位符到目标值的映射关系 replace_map = { "{{width}}" => 10, "{{length}}" => 20 } # 直接传入正则和映射表即可完成替换 result = input_str.gsub(/\{\{.*?\}\}/, replace_map) puts result # 输出:The dimension of the square is 10 and 20
如果想要简化哈希构造的写法,也可以不用在键里加双大括号,调整正则提取占位符名称即可:
replace_map = { width: 10, length: 20 } result = input_str.gsub(/\{\{(.*?)\}\}/) { replace_map[Regexp.last_match[1].to_sym] }
内容的提问来源于stack exchange,提问作者Divyansh Mishra
相关产品推荐
相关产品推荐

