解析自定义参数

解析/匹配自定义参数,进行转换。

例子:在构造文本时,使用到一些变量(可以认为是自定义参数)。规定使用“[]”来包裹变量,要使用正则表达式来解析出所填的变量,方便后续将变量名转换为值。

案例

//使用 RegExp对象
let reg = new RegExp("\\[\\w*\\]",'g');
let r = '大家好,我的名字叫[name]。今年我[age]岁了。很高兴认识[]大家!'.match(reg);
console.log(JSON.stringify(r));

//不使用 RegExp对象
let reg2 = /\[\w*\]/g;
let r2 = '大家好,我的名字叫[name]。今年我[age]岁了。很高兴认识[]大家!'.match(reg2);
console.log(JSON.stringify(r2));


//运行结果如下:
//["[name]","[age]","[]"]
//["[name]","[age]","[]"]

分析

  • \w,查找数字、字母及下划线。
  • *,匹配任何包含零个或多个 n 的字符串。
  • “\”,为转义符。使用RegExp对象,需特别注意转义,请仔细阅读代码。
  • g,全局匹配


扩展

扩展上边的案例,将正则表达式匹配到的结果进行进一步处理。例如:将 [name] 转换为 ${item.name}

使用正则

/**
 * 将 [name]  转换为  ${item.name}
 * @param {string} str 原字符串
 * @return {string} 处理后的字符串
 */
let changeStr = function(str) {
	str.match(/\[\w*\]/g).forEach(s => { //正则表达式分析,见上边的案例
		// s 为 ["[name]","[age]","[]"] 中取出的元素
		//将 [name]  转换为  ${item.name}
		let tempStr = s.replaceAll('[', '{').replaceAll(']', '}');
		if (tempStr !== '{}') tempStr = '$' + `{item.${tempStr.split('{')[1]}`
		//把 ${item.name} 替换掉原字符串str中的 [name]
		str = str.replaceAll(s, tempStr == '{}' ? '' : tempStr)
	})
	return str;
};

console.log(changeStr('大家好,我的名字叫[name]。今年我[age]岁了。很高兴认识[]大家!'));
//大家好,我的名字叫${item.name}。今年我${item.age}岁了。很高兴认识大家!

不使用正则

/**
 * 作用同上
 */
let handelParam = function(str) {
	let leftIndex = str.indexOf('[');
	let rightIndex = str.indexOf(']');
	if (leftIndex != -1 && rightIndex != -1) {
		//包含 []
		if (rightIndex - leftIndex > 1) {
			str = str.substr(0, leftIndex) + "${item." + str.substring(leftIndex + 1, rightIndex) + "}" + str
				.substr(rightIndex + 1);
		} else {
			// [] 中间没有参数。去掉[]即可
			str = str.substr(0, leftIndex) + str.substr(rightIndex + 1);
		}
		return handelParam(str);//递归
	} else {
		//不包含 [] 直接返回
		return str;
	}
}
console.log(handelParam('大家好,我的名字叫[name]。今年我[age]岁了。很高兴认识[]大家!'))
//大家好,我的名字叫${item.name}。今年我${item.age}岁了。很高兴认识大家!


应用示例

var str_var = "大家好,我的名字叫[name]。今年我[age]岁了。很高兴认识[]大家!";
var item = {
  name:'小黑',
  age:8
}
console.log(eval('`'+changeStr(str_var)+'`'));//大家好,我的名字叫小黑。今年我8岁了。很高兴认识大家!
console.log(eval('`'+handelParam(str_var)+'`'));//大家好,我的名字叫小黑。今年我8岁了。很高兴认识大家!

//eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行。
//等价于执行`大家好,我的名字叫${item.name}。今年我${item.age}岁了。很高兴认识大家!`
//从item中取出name与age的值
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值