1.需求描述
1.接口给定一个对象 obj //{'name':'张三','age':'17','sex':'男','rule':'$name$,今年$age$岁,性别$sex$'}
2.rule代表匹配的表达式 //'$name$,今年$age$岁,性别$sex$'
3.根据表达式匹配$变量名$ ,如$name$、$age$、$sex$,并将各变量名替换为obj.name、obj.age、obj.sex
// 即“张三,今年17岁,性别男”
2. 解决思路
2.1 走遍历,一点点判断,最基本的方法,没啥难度,废键盘的事儿,就不展开写了
2.2 正则, 目标:1-3行内代码搞定
3. 上手
3.1 核心思路
匹配到第一个$,和第二个$,并取出中间的字符串,即为字段名
方式:
正则,反向引用(可参考:正则反向引用文档)
\1:表示的是引用第一次匹配到的()括起来的部分
\2:表示的是引用第二次匹配到的()括起来的部分
var obj = {'name':'张三','age':'17','sex':'男','rule':'$name$,今年$age$岁,性别$sex$'}
obj.rule.replace(/(\$)(.*?)\1/g,(...v)=>obj[v[2]]) // 为什么是2?看下方console
两行 搞定!
3.2 解析
匹配结果规则:
[匹配完整项,第一个分组内容(括号为分组),… ,第N个分组内容,索引,完整字符串]
故我们需要取第二个分组内容,即v[2]
为什么用\1,而不是/\$(.*?)\$/g
看起来,好像/\$(.*?)\$/g更容易通俗易懂一点?
没错,如果需求仅仅只是上方所以描述的话,确实如此
那么,如果需求变成,$name$,%name%,&name&多种情况都算变量时,
(或者理解成引号,包括单引号、双引号、字符串模板引号)
再用/\$(.*?)\$/g进行拓展,是否手足无措?是否很难屏蔽掉$name%,%name&
再次解读:\1:表示的是引用第一次匹配到的()括起来的部分
反向引用的\1,是不是就无脑适配了呢