Javascript - 屏蔽字符串中的帐号

时间:2017-03-21 22:14:48

标签: javascript node.js regex security

我有一个有趣的挑战,我无法在这里找到答案。我有一串文字,可能可能包含一个帐号。 例如:

"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执行此操作。

你的方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:2)

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

\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

答案 1 :(得分:2)

借用Jan的令人敬畏的正则表达式模式,它可以扩展为捕获最后一位数字(参见下面的例子)

注意: 他使用replace()的方法更好,我建议明确使用它。这只是为了提供使用match()

的替代方法

&#13;
&#13;
//  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);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

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

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

并替换为

****\1

答案 3 :(得分:0)

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