正则实现轻量文本模板引擎需匹配{{key}}并安全替换:基础用/{{(w+)}}/g捕获变量名,点号路径改用/{{([w.]+)}}/g配合reduce取值,加强版支持空格和过滤器/{{s([w.]+)s(?:|s(w+))?s}}/g,统一HTML转义防XSS。
用正则实现一个轻量文本模板引擎,核心是匹配 {{key}} 这类占位符并替换成对应数据,关键在于正确提取变量名、安全替换、避免误匹配。
最简场景:模板为 "Hello {{name}}, you have {{count}} messages",数据为 {name: "Alice", count: 5}。可用 /{{(w+)}}/g 全局匹配,括号捕获变量名,再用 replace 回调函数查表替换:
template.replace(/{{(w+)}}/g, (match, key) => data[key] ?? '')g 标志,否则只替换第一个?? '' 防止 undefined 被转成字符串 "undefined"
原始正则 w+ 不支持点号,需扩展为 [w.]+,但要注意不能匹配空格或括号等非法字符。替换逻辑也要升级:把 "user.profile.name" 拆成路径数组,逐级取值:
/{{([w.]+)}}/g
key.split('.').reduce((obj, k) => obj?.[k], data) 安全取值直接输出用户数据可能引发 XSS,尤其当模板来自不可信来源时。同时要防止 {{name}}} 或 {{{name}} 这类不配对结构干扰匹配:
立即学习“Java免费学习笔记(深入)”;
/{{s*([w.]+)s*}}/g,允许内部空格,更鲁棒&、、<code>> 替换为对应实体{{{html}}},单独匹配处理在占位符中加入管道符,可解析为 key 和 filter 两部分。正则升级为:/{{s*([w.]+)s*(?:|s*(w+))?s*}}/g
(w+) 可选,匹配过滤器名filters.uppercase(val)