我试图通过用 javaScript 字符串替换函数将私有数据的某些部分替换为星号(*)来实现一个简单的数据屏蔽函数。
所以我所做的如下:
function privateDataMask(data, options) {
var str = JSON.stringify(data);
var i = 0, len = options.length;
for (i; i < len; i++) {
var opt = options[i];
var key = opt.key;
var reg = opt.reg;
var _reg = new RegExp('"' + key + '":"' + reg.source + '"', 'g'); //To get new reg which includes the key, like /"tel":"(\d{3})(\d*)(\d{4})"/g
str = str.replace(_reg, '"' + key + '":"$1*$3"');
//str = str.replace(_reg, '"' + key + '":"$1' + '*'.repeat($2.length) + '$3",'); //ReferenceError: $2 is not defined
//str = str.replace(_reg, '"' + key + '":"$1' + '*'.repeat(RegExp.$2.length) + '$3",'); //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n
}
return JSON.parse(str);
}
var data = [{
name: "王梅",
tel: "15812346584",
id: "22040219820418866X"
}, {
name: "吴青峰",
tel: "13921345678",
id: "450328197006157868"
},
{
name: "王张玉成",
tel: "17734685988",
id: "620100198109198020"
}
];
var options = [{
key: 'name',
reg: /([\u4e00-\u9fa5A-Za-z0-9\·\.]?)([\u4e00-\u9fa5A-Za-z0-9\·\.]+)([\u4e00-\u9fa5A-Za-z0-9\·\.]+)/
},
{
key: 'tel',
reg: /(\d{3})(\d*)(\d{4})/
},
{
key: 'id',
reg: /(\d{6})(\d*)(\d{5}(\d|X){1})/
}
]
var maskedData = privateDataMask(data, options);
console.log(maskedData);
它以某种方式按预期工作,但我仍然想做一些小的改进,例如可以转移,名称:“吴青峰”->名称:“吴*峰”,名称:“王张玉成”->名称:“王**成”,电话:“15812346584”->电话:“158****6584”等。
也就是说,在替换的部分添加多个星号(),星号()的数量应该等于String.replace()期间捕获的组的长度。
正如注释行所表明的那样,我尝试过'*'.repeat(RegExp.$2.length)之类的东西,难题是RegExp.$n只能在String.replace()函数完成后才能获得价值,这会导致错位.
因此,请问有什么方法可以在 String.replace() 函数期间同时获取捕获组的长度吗?