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

时间:2017-07-05 03:32:00

标签: javascript regex

在我的应用程序中,我将一个字母数字字符串传递给我的函数。此字符串通常为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个字符以外的所有字符。对于每个匹配的字符,它都不知道这样做。有什么想法吗?

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);