regex JavaScript -在字符串中屏蔽帐号

dfty9e19  于 2023-10-22  发布在  Java
关注(0)|答案(5)|浏览(136)

我有一个有趣的挑战,我在这里找不到答案。我有一个文本字符串,它可能包含一个账号。范例:

"Hi, my account number is 1234 5678 9012 2345 and I'm great."

帐号可以有多种形式,因为它是由用户输入的:
基本和潜在的可能性如下:

1234 1234 1234 1234
1234 1234 1234 1234 1
BE12 1234 1234 1234

1234-1234-1234-1234
1234.1234.1234.1234
1234123412341234
12341234 1234 1234

1234-1234-1234-1234-1
1234.1234.1234.1234.1
12341234123412341
12341 234 1234 12341

BE12-1234-1234-1234
be12-1234-1234 1234
Be12.1234.1234-1234
BE12123412341234

(基本上是中间带连字符、空格或点的整数,IBAN格式除外,它在开头有两个字符)
我需要的输出是除了最后四个数字之外的所有内容都被屏蔽了。

"Hi, my account number is **** **** **** 2345 and I'm great."

我认为我应该如何处理这个问题:

  • 分析每一个字符串,并试图找到上述帐户号码。模式
  • 创建一个神奇的正则表达式来替换帐号。我需要的方式
  • 如果有账号,请使用此RegEx。

你的方法是什么?
谢谢你,谢谢

wdebmtf2

wdebmtf21#

您可以将上述所有内容与以下内容相匹配:

\b[\dX][-. \dX]+(\d{4})\b

.并将其替换为* x strlen(match) - 4 + \1,参见a demo on regex101.com
JavaScript中:

var string = "Hi, my account number is 1234 5678 9012 2345 and I'm great.";
var new_string = string.replace(/\b[\dX][-. \dX]+(\d{4})\b/g, function(match, capture) {
    return Array(match.length-4).join("*") + capture;
});
print(new_string);

参见a demo on ideone.com

csbfibhn

csbfibhn2#

借用Jan的正则表达式模式,它也可以扩展为捕获最后一个数字(参见下面的示例)

***注意:***他使用replace()的方法更好,为了清晰起见,我建议使用它。这只是为了提供一种使用match() 的替代方法

//  Setup
let str = `1234 1234 1234 1234
1234-1234-1234-1234
12341234123412341234
1234 1234 1234 1234 1
12341234123412341
1234-1234-1234-1234-1
1234.1234.1234.1234.1
XX12 3456 1234 1234
XX123456123123
XX12-3456-1234-1234
XX12.3456.1234.1234
This is a sentence for visual proof 1234 5678 9012 3456
And some XX32 1111.2222-9999-2 more proof`,
  nums = str.split('\n');


var re = new RegExp(/(\b[\dX][-. \dX]+(\d{4}.?\d?)\b)/);

// Convert Nums
var converted = nums.map(num => {
  let match = num.match(re);

  if (match) {
    let orig = match[1],
      end    = match[2],
      hidden = orig.substr(0, orig.length - end.length);

    hidden = hidden.replace(/\S/g, "X") + end;
    num    = num.replace(orig, hidden);
  }

  return num;
});

// Visual Verification
console.log(converted);
ndh0cuux

ndh0cuux3#

str.replace(/\b[\dX][-. \dX]+(\d{4})\b/g, '**** **** **** $1')
console.log("Hi, my account number is 1234-5678-9012-2345 and I'm great.".replace(/\b[\dX][-. \dX]+(\d{4})\b/g, '**** **** **** $1'));
console.log("Hi, my account number is 1234 5678 9012 2345 and I'm great.".replace(/\b[\dX][-. \dX]+(\d{4})\b/g, '**** **** **** $1'));
console.log("Hi, my account number is 1234.5678.9012.2345.1 and I'm great.".replace(/\b[\dX][-. \dX]+(\d{4})\b/g, '**** **** **** $1'));
console.log("Hi, my account number is XX123456123123 and I'm great.".replace(/\b[\dX][-. \dX]+(\d{4})\b/g, '**** **** **** $1'));
91zkwejq

91zkwejq4#

使用带有look ahead技巧的正则表达式,只需查找

\d{4}([ -.])(?![A-Za-z])

并替换为

****\1
g0czyy6m

g0czyy6m5#

const masking = function (numbers) {

  const str = String(numbers);

  //another method for converting  number to the string --const str = numbers + "";

  const slici = str.slice(-4);

  // console.log(slici);

  const padding = slici.padStart(str.length, '*');

  console.log(`Hi, my account number is ${padding} and I'm great`);

};

masking(456871398401);

masking(8235101466187);

相关问题