解析/匹配自定义参数,进行转换。
例子:在构造文本时,使用到一些变量(可以认为是自定义参数)。规定使用“[]”来包裹变量,要使用正则表达式来解析出所填的变量,方便后续将变量名转换为值。
案例
//使用 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的值
474





