Node.js如何批量替换文件中的多个模板变量?
问题:如何批量替换文本中的多个变量?
场景与尝试过程
form.txt 文件内容如下:
Name : $name
Gender : $gender
Age : $age
第一次尝试代码
const fs = require('fs').promises; var rForm = await fs.readFile(__dirname + '/form.txt', 'utf8'); var name = 'maman'; var gender = 'male'; var age = 10; rForm.replace('$name', name); rForm.replace('$gender', gender); rForm.replace('$age', age); console.log(rForm);
执行后变量未被替换,输出和原文件内容一致:
Name : $name
Gender : $gender
Age : $age
期望的正确输出:
Name: maman
Gender: male
Age: 10
第二次尝试代码
const fs = require('fs').promises; var rForm = await fs.readFile(__dirname + '/form.txt', 'utf8'); var name = 'maman'; var gender = 'male'; var age = 10; var nm = rForm.replace('$name', name); var gn = rForm.replace('$gender', gender); var ag = rForm.replace('$age', age); console.log(nm); console.log(gn); console.log(ag);
执行后仅单个变量被替换,输出三个分别替换了不同变量的结果:
Name : maman
Gender : $gender
Age : $age
Name : $name
Gender : male
Age : $age
Name : $name
Gender : $gender
Age : 10
请问在此场景下,如何实现多个变量的批量替换?
解决方案
核心问题是:JavaScript 里的字符串是不可变类型,replace() 方法不会修改原字符串,而是返回一个新的替换后的字符串。第一次尝试没赋值返回值,所以原字符串没变;第二次每次都基于原始字符串替换,自然每个结果只改了一个变量。
下面是两种可行的批量替换方法:
方法一:链式调用 replace()
每次把前一次替换的结果作为下一次替换的输入,用新结果覆盖原变量:
const fs = require('fs').promises; var rForm = await fs.readFile(__dirname + '/form.txt', 'utf8'); var name = 'maman'; var gender = 'male'; var age = 10; // 链式替换,逐步更新rForm rForm = rForm.replace('$name', name) .replace('$gender', gender) .replace('$age', age); console.log(rForm);
方法二:正则表达式 + 变量对象(适合多变量场景)
如果后续要添加更多变量,这种方法更高效——把变量存到对象中,用正则匹配所有 $xxx 格式的变量,批量替换:
const fs = require('fs').promises; var rForm = await fs.readFile(__dirname + '/form.txt', 'utf8'); // 把所有变量存在一个对象里 const variables = { name: 'maman', gender: 'male', age: 10 }; // 正则匹配所有以$开头的变量名,从对象中取对应值替换 rForm = rForm.replace(/\$(\w+)/g, (match, key) => { // 如果变量存在就替换,不存在保留原内容 return variables[key] || match; }); console.log(rForm);
两种方法都能得到你想要的输出,第二种扩展性更强,新增变量只需修改 variables 对象,不用额外加 replace() 调用。
内容的提问来源于stack exchange,提问作者I N A
相关产品推荐
相关产品推荐

