为何Ruby中gsub结合字符串与哈希执行替换失败?
问题排查与修正
你的代码有两个关键问题导致替换失败:
1. 哈希键与占位符不匹配
字符串中的第一个占位符是{{content}},但哈希里对应的键是"contents"(多了末尾的s),这会导致第一个占位符找不到对应值返回nil,最终被替换为空字符串。
2. 正则匹配后的取值错误
gsub的块参数x是整个匹配到的字符串(比如{{content}}),但你的哈希键是去掉双花括号的纯名称(比如content),所以应该提取正则捕获组的内容(也就是(.*?)匹配到的部分)来作为哈希的键。
修正后的代码
s = '{{content}}, {{expected}}, {{description}}' h = {"content"=>"new int[]{1, 2, 3, 4}", "expected"=>"new java.util.ArrayList<Integer>(){{add(4);add(3);add(2);add(1);}}", "description"=>"example"} result = s.gsub(/\{\{(.*?)\}\}/) { h[$1] }
代码说明
- 修正了哈希中第一个键的名称,从
"contents"改为"content",和占位符一致。 - 在
gsub的块中使用$1获取正则表达式中第一个捕获组匹配到的内容(即双花括号内的纯键名),用它去哈希中取值。
运行这段代码后,result会得到正确的替换结果:"new int[]{1, 2, 3, 4}, new java.util.ArrayList<Integer>(){{add(4);add(3);add(2);add(1);}}, example"
内容的提问来源于stack exchange,提问作者Divyansh Mishra
相关产品推荐
相关产品推荐

