codewars在线编程练习总结:信用卡数组隐藏
问题:编写一个函数maskify,它将除最后四个字符之外的所有字符都改为’#’。
列子:
maskify("4556364607935616") == "############5616"
maskify( "64607935616") == "#######5616"
maskify( "1") == "1"
maskify( "") == ""
maskify("Skippy") == "##ippy"
maskify("Nananananananananananananananana Batman!") == "####################################man!"
解决方案一:slice+正则匹配
function maskify(cc) {
return cc.slice(0, -4).replace(/./g, '#') + cc.slice(-4);
}
解决方案二:正则前瞻
function maskify(cc) {
return cc.replace(/.(?=....)/g, '#');
}
补充知识:正则前瞻:
前瞻:
exp1(?=exp2) 查找exp2前面的exp1
后顾:
(?<=exp2)exp1 查找exp2后面的exp1
负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1
举例:
"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr
"法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到
from csdn blog
衍生话题:ES6 repeat 自实现
function str_repeat(str, num){
return new Array( num + 1 ).join( str );
}
str_repeat("#",5);//##### 这是把字符串str重复num次的函数实现