在 JavaScript 中同时使用 String Replace with Regex 时如何获取捕获组的长度?
How to get length of captured groups when using String Replace with Regex in JavaScript concurrently?
我正在尝试通过使用 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 + '":"*"');
//str = str.replace(_reg, '"' + key + '":"' + '*'.repeat(.length) + '",'); //ReferenceError: is not defined
//str = str.replace(_reg, '"' + key + '":"' + '*'.repeat(RegExp..length) + '",'); //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只能在[=32=之后获得价值]()函数结束,导致错位。
因此,请问有什么方法可以在 String.replace() 函数中同时获取捕获组的长度吗?
您可以传递一个 function as second parameter to .replace(),该函数将计算 *
的添加量。
_str = _str.replace(_reg, (text, start, middle, end) => `"${key}":"${start + '*'.repeat(middle.length) + end}"`);
演示:
function privateDataMask(data, options) {
var str = JSON.stringify(data);
var i = 0;
var len = options.length;
var _str, _data;
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
//console.log(_reg);
if (!_str) {
_str = str;
}
_str = _str.replace(_reg, (text, start, middle, end) => `"${key}":"${start + '*'.repeat(middle.length) + end}"`);
}
_data = JSON.parse(_str);
return _data;
}
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);
我正在尝试通过使用 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 + '":"*"');
//str = str.replace(_reg, '"' + key + '":"' + '*'.repeat(.length) + '",'); //ReferenceError: is not defined
//str = str.replace(_reg, '"' + key + '":"' + '*'.repeat(RegExp..length) + '",'); //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只能在[=32=之后获得价值]()函数结束,导致错位。
因此,请问有什么方法可以在 String.replace() 函数中同时获取捕获组的长度吗?
您可以传递一个 function as second parameter to .replace(),该函数将计算 *
的添加量。
_str = _str.replace(_reg, (text, start, middle, end) => `"${key}":"${start + '*'.repeat(middle.length) + end}"`);
演示:
function privateDataMask(data, options) {
var str = JSON.stringify(data);
var i = 0;
var len = options.length;
var _str, _data;
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
//console.log(_reg);
if (!_str) {
_str = str;
}
_str = _str.replace(_reg, (text, start, middle, end) => `"${key}":"${start + '*'.repeat(middle.length) + end}"`);
}
_data = JSON.parse(_str);
return _data;
}
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);