首页 > 解决方案 > 如何在第一个字符后屏蔽字符串

问题描述

假设我有一个包含人名的字符串:

var name = "Jason, Bruno Mars";

如何掩盖逗号string后面X的名称并返回:

var name = "Jason, BXXXX MXXX";

我尝试使用以下方法,但只有前面的字符被屏蔽:

string first, second, output;
bool hasSpace, hasComma;
int int_LENGTH;
var name = "Jason, Bruno Mars";
hasComma = name.Contains(",");

if (hasComma == true)
{
    int_LENGTH = name.IndexOf(",");
    if (int_LENGTH > 0)
    {
        first = name.Substring(0, int_LENGTH);
    }

    second = string.Join(",", name.Split(" ").Skip(1));
    hasSpace = second.Contains(" ");

    if (hasSpace == true)
    {
        second = string.Concat(new string('X', 12), second.Substring(second.Length - 4));
        output = first + "," + second;
    }
}

任何人都对如何以更有效的方式实现相同的结果有更好的了解?

标签: c#data-masking

解决方案


另一种选择,使用Regex.Matches选择除第一个字母之外的名称部分。正则表达式收集由空格分隔的所有字符串部分,跳过逗号之前的内容。
然后将 的集合Matches传递给 Linq 的Aggregate()方法以执行替换。StringBuilder
用于存储由它自己的Replace()方法生成的字符串:

string theName = "Jason Et Alt., Bruno Mars And More Names";
var matches = Regex.Matches(theName, @"(?!.*?,)\s+?.(\w+)");

string outName = matches.OfType<Match>().Aggregate(new StringBuilder(theName), (sb, m) => 
   sb.Replace(m.Groups[1].Value, new string('X', m.Groups[1].Length))).ToString();

outname = Jason Et Alt., BXXXX MXXX AXX MXXX NXXXX

推荐阅读