撸个字符串模板

382 阅读1分钟
题目:
    let str = '你好,我叫{{name}},今年{{age}}岁了}',
    实现函数: compile(str,{name:"小明",age:18})

输出:你好,我叫小明,今年18岁了

实现思路:使用正则匹配目标字符{{...}},提取key,根据key获取value值。

正则:/\{\{(.*?)}}/g

function compile(str,obj){
    return str.replace(/\{\{(.*?)}}/g,function(matchText,key){
        return obj[key.trim()]
    })
}

正则分析:

1.匹配双大括号 {{}}的正则 /\{\{}}/;

2.匹配任意字符 /.*/

3.结合1、2可以匹配到{{name}}形式 /\{\{.*}}/

4.为了提取出双大括号之间的字段,进行分组操作 /\{\{(.*)}}/

5.第4步会出现提取出  name}},今年{{age 的情况,这主要是因为正则是尽可能多的匹配符合的字符,所以要惰性匹配,此时正则修改为 /\{\{(.*?)}}/g