Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-在字符串中屏蔽帐号_Javascript_Node.js_Regex_Security - Fatal编程技术网

Javascript-在字符串中屏蔽帐号

Javascript-在字符串中屏蔽帐号,javascript,node.js,regex,security,Javascript,Node.js,Regex,Security,我有一个有趣的挑战,我在这里找不到答案。我有一个文本字符串,可能包含一个帐号。 例如: 帐号可以有多种风格,因为它是由用户输入的: 基本和潜在的可能性如下: 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 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."
我认为我应该如何处理这个问题:

  • 分析每个字符串,并尝试找到上述帐号模式
  • 创建一个神奇的正则表达式来替换帐号。它们是我所需要的
  • 如果有帐号,请使用此正则表达式
你的方法是什么


谢谢

您可以将上述所有内容与:

\b[\dX][-. \dX]+(\d{4})\b
。。。并将其替换为strlen(匹配)-4+
\1
,请参阅。
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);

请参阅。

使用带有
前瞻性
技巧的正则表达式,只需查找

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

****\1
console.log(“嗨,我的账号是1234-5678-9012-2345,我很好。”。替换(/\b[\dX][-.\dX]+(\d{4})\b/g,*****$1”);
log(“嗨,我的账号是1234 5678 9012 2345,我很好。”。替换(/\b[\dX][-.\dX]+(\d{4})\b/g,***$1”);
log(“嗨,我的帐号是1234.5678.9012.2345.1,我很好。”。替换(/\b[\dX][-.\dX]+(\d{4})\b/g,***$1”);

log(“嗨,我的帐号是XX123456123123,我很好。”.replace(/\b[\dX][-.\dX]+(\d{4})\b/g,***$1')借用Jan令人敬畏的正则表达式模式,它也可以扩展以捕获最后一个数字(参见下面的示例)

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

//设置
设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
这是一句视觉证明1234 5678 9012 3456
还有一些XX321111.2222-9999-2更多的证据`,
nums=str.split('\n');
var re=new RegExp(/(\b[\dX][-.\dX]+(\d{4}.?\d?\b)/);
//转换Nums
var converted=nums.map(num=>{
让match=num.match(re);
如果(匹配){
设orig=match[1],
结束=匹配[2],
隐藏=原始子字符串(0,原始长度-结束长度);
隐藏=隐藏。替换(/\S/g,“X”)+结束;
num=num.replace(原始,隐藏);
}
返回num;
});
//视觉验证

console.log(已转换)必须使用
JavaScript
吗?其他正则表达式引擎有更好的支持。我将在node.js中这样做,所以我想是的。除非我不知道有什么很棒的npm软件包。这可能是一个开始:-但是需要更多的输入字符串。
XX123456123123
缺少2个字符,任何16个数字计数都会失败<代码>1234123411234123411234
你怎么有20个号码?你的账号是否遵循特定规则,是否包含校验和?太好了!这里还有两个问题需要解决:如果用户写的是其他字符而不是“XX”,该怎么办?我们能把它变成任何字符(大写/小写)吗?此外,较长数字的最后一位(17位)不匹配:-(@flaesh:当然,您可以使其更匹配,只需在方括号中包含您希望允许的字符,但请提供一些更真实的输入字符串(即编辑您的问题).Edited。谢谢你的建议。太棒了!这帮我解决了这个问题;我刚刚编辑到:\b[\dBb][-.\dEe]+(\d{4})\b以匹配“BE”而不是“XX”。谢谢!第三个数字不超过最后一个数字+1:)
****\1
str.replace(/\b[\dX][-. \dX]+(\d{4})\b/g, '**** **** **** $1')