可以利用 Vec<u8>
原地构建String
, 省去一次复制
pub fn mask_pii(s: String) -> String {
let (mut is_email, mut at_pos) = (false, 0);
let mut chrs = vec![];
for &(mut b) in s.as_bytes() {
if b == b'+' || b == b'-' || b == b'(' || b == b')' || b == b' ' {
continue;
}
if b == b'@' {
is_email = true;
at_pos = chrs.len();
} else if b >= b'A' && b <= b'Z' {
b = b - b'A' + b'a';
}
chrs.push(b);
}
let mut ret = vec![];
if is_email {
ret.push(chrs[0]);
ret.extend_from_slice("*****".as_bytes());
ret.extend_from_slice(&chrs[at_pos - 1..]);
} else {
if chrs.len() == 13 {
ret.extend_from_slice("+***-***-***-".as_bytes());
} else if chrs.len() == 12 {
ret.extend_from_slice("+**-***-***-".as_bytes());
} else if chrs.len() == 11 {
ret.extend_from_slice("+*-***-***-".as_bytes());
} else {
ret.extend_from_slice("***-***-".as_bytes());
}
ret.extend_from_slice(&chrs[chrs.len() - 4..]);
}
String::from_utf8(ret).unwrap()
}