正则表达式处理表达式替换内容方案

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 解析

console

匹配结果规则:

[匹配完整项,第一个分组内容(括号为分组),… ,第N个分组内容,索引,完整字符串]
故我们需要取第二个分组内容,即v[2]

为什么用\1,而不是/\$(.*?)\$/g

看起来,好像/\$(.*?)\$/g更容易通俗易懂一点?
没错,如果需求仅仅只是上方所以描述的话,确实如此

那么,如果需求变成,$name$,%name%,&name&多种情况都算变量时,
(或者理解成引号,包括单引号、双引号、字符串模板引号)
再用/\$(.*?)\$/g进行拓展,是否手足无措?是否很难屏蔽掉$name%,%name&

再次解读:\1:表示的是引用第一次匹配到的()括起来的部分
反向引用的\1,是不是就无脑适配了呢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值