积极的背后看的另一种选择



我刚刚发现,在旧的浏览器中,积极的向后看不起作用,我在IE11上遇到了这个问题,即意外的量词

正则表达式:/(?<=d{4})d(?=d{4})/g

输入:const string = 4444333322221111;

string.replace(/(?<=d{4})d(?=d{4})/g, "#");

预期结果:4444########1111

此正则表达式的任何替代方案都会有所帮助。

如果您的字符串只由数字组成您真的不需要正则表达式,您只需要两种字符串操作方法:

// Adapted from https://stackoverflow.com/a/5450113/3832970, count will always be positive here
function strRepeat(pattern, count) {
var result = '';
while (count > 1) {
if (count & 1) result += pattern;
count >>= 1, pattern += pattern;
}
return result + pattern;
};
var string = "4444333322221111";
console.log(
string.substring(0,4) + strRepeat("#", string.length-8) + string.slice(-4)
)

如果您需要在较长的字符串中屏蔽两边各有四位数字的数字,您可以使用:

function strRepeat(pattern, count) {
var result = '';
while (count > 1) {
if (count & 1) result += pattern;
count >>= 1, pattern += pattern;
}
return result + pattern;
};
var string = "111109876543210000 abc 1234012345678904321";
console.log(
string.replace(/d{9,}/g, function(match) { 
return match.substr(0,4) + strRepeat("#", match.length-8) + match.slice(-4); 
})
)

这里,

  • /d{9,}/g匹配所有出现的九位或九位以上数字
  • function(match) {...}-一个回调方法,它接受正则表达式匹配,您可以在此处操作输出
  • match.substr(0,4) + "#".repeat(match.length-8) + match.slice(-4)-插入前4位数字,然后追加需要用#替换的数字,然后添加剩余的4位数字

如果你愿意,你可以用捕获组来制作正则表达式模式,它会使回调方法变小,但会使正则表达式变长:

function strRepeat(pattern, count) {
var result = '';
while (count > 1) {
if (count & 1) result += pattern;
count >>= 1, pattern += pattern;
}
return result + pattern;
};
var string = "111109876543210000 abc 1234012345678904321";
console.log(
string.replace(/(d{4})(d+)(d{4})/g, function($0, $1, $2, $3) { 
return $1 + strRepeat("#", $2.length-8) + $3; 
})
)

这里,(d{4})(d+)(d{4})模式将把4个数字捕获到组1($1(中,然后把1+个数字捕获在组2($2(中,并且然后把4个数据捕获到组3($3(中。

您的输入字符串看起来像一个支付卡号。您不需要regex,可以使用简单的字符串处理函数,如String.substring()和字符串串联。

例如:

const str = '1111222233334444';
const masked = str.substring(0, 4) + 
'#'.repeat(str.length - 8) + 
str.substring(str.length - 4)
console.log(masked);

正则表达式解决方案不需要使用查找:

const str = '1111222233334444';
const masked = str.replace(/^(d{4})(d*)(d{4})$/,
`$1${"#".repeat(str.length - 8)}$3`);
console.log(masked);

您可以获取一个函数和索引,并将前四位替换为digit或#

var string = '4444333322221111';
console.log(string.replace(/d(?=d{4})/g, function (v, i) { return i < 4 ? v : '#'; }));

使用切片字符串更新。

var string = '4444333322221111',
result =
string.slice(0, 4) +
string.slice(4, -4).replace(/./g, '#') +
string.slice(-4);
console.log(result)

最新更新