创建正则表达式以将字符串中每个匹配的字符替换为相同的字符

swa*_*ord 7 javascript regex

在我的应用程序中,我有一个字母数字字符串被传递到我的函数中。该字符串通常为 17 个字符,但并非总是如此。我正在尝试编写一个正则表达式来匹配字符串中除最后 4 个字符之外的所有字符,并将它们替换为 X (以屏蔽它)。

例如

Input: HGHG8686HGHG8686H

Output: XXXXXXXXXXXXX686H
Run Code Online (Sandbox Code Playgroud)

我编写的用于对字符串执行替换的正则表达式如下

[a-zA-Z0-9].{12}
Run Code Online (Sandbox Code Playgroud)

代码:

const maskedString = string.replace(/[a-zA-Z0-9].{12}/g, 'X');
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,它将字符串中除最后 4 个字符之外的所有字符替换为单个 X。它不知道对每个匹配的字符都执行此操作。有任何想法吗?

小智 1

向前看 ( ?=)确保至少有四个以下字符。

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();
Run Code Online (Sandbox Code Playgroud)
<p><label>Input: </label><input id="input"></p>
<p>Output: <span id="output"></span></p>
Run Code Online (Sandbox Code Playgroud)

非正则表达式解决方案:

const test = "HGHG8686HGHG8686H";

function fix(str) {
  return 'X'.repeat(str.length - 4) + str.slice(-4);
}
  
console.log(fix(test));
Run Code Online (Sandbox Code Playgroud)

String#repeat你在 IE 中找不到。