在我的应用程序中,我将一个字母数字字符串传递给我的函数。此字符串通常为17个字符,但并非总是如此。我试着编写一个匹配除字符串中最后4个字符之外的所有字符的正则表达式,并用X替换它们(以掩盖它)。
例如
Input: HGHG8686HGHG8686H
Output: XXXXXXXXXXXXX686H
我写的正则表达式对字符串执行替换如下
[a-zA-Z0-9].{12}
代码:
const maskedString = string.replace(/[a-zA-Z0-9].{12}/g, 'X');
我遇到的问题是它只用单个X替换字符串中的最后4个字符以外的所有字符。对于每个匹配的字符,它都不知道这样做。有什么想法吗?
答案 0 :(得分:1)
你可以在replace中使用一个函数来执行此操作,类似这样的事情:
var str = "HGHG8686HGHG8686H"
var regexp = /[a-zA-Z0-9]+(?=....)/g;
var modifiedStr = str.replace(regexp, function ($2) {
return ('X'.repeat($2.length +1));
});
console.log(modifiedStr);
答案 1 :(得分:1)
Look ahead (?=
)以确保至少有以下四个字符。
const regex = /.(?=....)/g;
// ^ MATCH ANYTHING
// ^^^^^^^^ THAT IS FOLLOWED BY FOUR CHARS
function fix(str) { return str.replace(regex, 'X'); }
const test = "HGHG8686HGHG8686H";
// CODE BELOW IS MERELY FOR DEMO PURPOSES
const input = document.getElementById("input");
const output = document.getElementById("output");
function populate() { output.textContent = fix(input.value); }
input.addEventListener("input", populate);
input.value = test;
populate();
<p><label>Input: </label><input id="input"></p>
<p>Output: <span id="output"></span></p>
非正则表达式解决方案:
const test = "HGHG8686HGHG8686H";
function fix(str) {
return 'X'.repeat(str.length - 4) + str.slice(-4);
}
console.log(fix(test));
您在IE中找不到String#repeat
。
答案 2 :(得分:1)
简单版本:(更易于阅读)
const maskedString = string.replace(/(.{4})$|(^(..)|(.))/g, 'X\1'); // or X$1
现在使用:[a-zA-Z0-9]
const maskedString = string.replace(/([a-zA-Z0-9]{4})$|(^([a-zA-Z0-9]{2})|([a-zA-Z0-9]{1}))/g, 'X\1'); // or X$1
注意:我在START PLUS TWO字符上匹配的原因是抵消第一场比赛。 (最后附加的最后4个字符。)
答案 3 :(得分:0)
您可以使用以下方法:
var str = "HGHG8686HGHG8686H"
var replaced=''
var match = str.match(/.+/)
for(i=0;i<match[0].length-4;i++){
str = match[0][i]
replaced += "X"
}
replaced += match[0].substr(match[0].length-4)
console.log(replaced);