esc to dismiss
x

信息

题解

Info

可以利用 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()
}
x