正则表达式可高效替换模板占位符,需适配双大括号、美元符、中括号等语法,安全提取变量名并从预定义对象取值,避免注入与死循环。

正则表达式可以高效实现模板字符串的占位符替换,核心是匹配特定格式的变量标记(如{{name}}或$name),再用对应值替换。关键是设计准确的模式、安全提取变量名、避免注入风险。
识别常见模板语法
不同模板习惯用不同符号包裹变量,正则需适配:
-
双大括号:如
{{user}}→ 模式:/\{\{(\w+)\}\}/g -
美元符号:如
$name或${age}→ 模式:/\$(\w+)|\$\{(\w+)\}/g(注意分组捕获逻辑) -
中括号:如
[title]→ 模式:/\[(\w+)\]/g
安全提取变量名并替换
不要直接拼接用户输入,应从预定义数据对象中取值。使用replace配合回调函数:
const template = "Hello {{name}}, you are {{age}} years old.";
const data = { name: "Alice", age: 30 };
template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
return data[key] !== undefined ? String(data[key]) : "";
});
// → "Hello Alice, you are 30 years old."
回调中key是捕获组内容,确保只访问data中存在的属性,防止原型链污染或意外访问。
支持嵌套路径和简单表达式(进阶)
若需处理{{user.profile.name}},基础\w+不够用。可扩展为:
- 模式:
/\{\{([\w.]+)\}\}/g(允许点号) - 解析路径:
key.split('.').reduce((obj, k) => obj?.[k], data) - 注意边界:避免执行任意代码,不支持
{{1+1}}等表达式计算 —— 那属于模板引擎范畴,正则不适合做求值
规避常见陷阱
实际使用时容易忽略这些细节:
- 未加
g标志 → 只替换第一个匹配项 - 未转义特殊字符 → 如
{、}、$在正则中有含义,必须反斜杠转义 - 变量名含非法字符 →
\w+不匹配中文、短横线等,如需支持可改用[a-zA-Z0-9_\u4e00-\u9fa5\-]+ - 重复替换导致死循环 → 确保替换结果不再匹配原模式(例如避免把
{{name}}替换成含{{的字符串)











