我有一个有趣的挑战,我无法在这里找到答案。我有一串文字,可能可能包含一个帐号。 例如:
"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."
我认为我应该如何解决这个问题:
你的方法是什么?
谢谢!
答案 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);
答案 1 :(得分:2)
借用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);

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