【问题标题】:How to mask string after first character如何在第一个字符后屏蔽字符串
【发布时间】:2020-02-17 04:07:35
【问题描述】:

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

var name = "Jason, Bruno Mars";

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

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


【解决方案1】:

另一个选项,使用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

【讨论】:

    【解决方案2】:
    static string MaskName(string name)
        {
            string maskedString = string.Empty;
    
            string[] names = name.Split(',');
            if (names.Length > 0)
            {
                maskedString = names[0] + ",";
            }
            if (names.Length > 1)
            {
                string[] arrName = names[1].Split(' ');
                foreach (string s in arrName)
                {
                    if (s.Length > 0)
                        maskedString += " " + s[0].ToString().PadRight(s.Length, 'X');
                }
            }
            return maskedString;
        }
    

    【讨论】:

      【解决方案3】:
      Using This code..
      
          static string MaskName(string name)
          {
              string maskedString = string.Empty;
      
              string[] names = name.Split(',');
              if (names.Length > 0)
              {
                  maskedString = names[0] + ",";
              }
              if (names.Length > 1)
              {
                  string[] arrName = names[1].Split(' ');
                  foreach (string s in arrName)
                  {
                      if (s.Length > 0)
                          maskedString += " " + s[0].ToString().PadRight(s.Length, 'X');
                  }
              }
              return maskedString;
          }
      

      输出:-

      【讨论】:

        【解决方案4】:

        试试这个

         private string ReturnMaskedName(string name)
                {
                    string temporary = "";
                    var newname = (name.Split(new string[] { "," }, StringSplitOptions.None)[1].Trim().Split(new String[] { " " }, StringSplitOptions.None));
        
                    foreach (string allnames in newname)
                    {
                        temporary = temporary + " " + allnames[0].ToString() + new string('X', allnames.Length - 1);
                    }
                    return name.Split(new string[] { " " }, StringSplitOptions.None)[0] + " " + temporary;
                }
        

        【讨论】:

          【解决方案5】:

          没有SplitRegexusing System.Linq的有效屏蔽方法:

          对于 C# 版本

          static string MaskName(string name)
          {
              int indexOfComma = name.IndexOf(',');
          
              if (indexOfComma != -1)
              {
                  char[] temp = name.ToCharArray();
          
                  bool isFirstChar = true;
          
                  for (int i = indexOfComma + 1; i < temp.Length; i++)
                  {
                      if (temp[i] == ' ')
                          isFirstChar = true;
                      else if (isFirstChar)
                          isFirstChar = false;
                      else
                          temp[i] = 'X';
                  }
          
                  return new string(temp);
              }
              else
              {
                  return name;
              }
          }
          

          对于 C# 版本 >= 7.2:

          static string MaskName(ReadOnlySpan<char> name)
          {
              int indexOfComma = name.IndexOf(',');
          
              if (indexOfComma != -1)
              {
                  Span<char> temp = stackalloc char[name.Length];
          
                  name.CopyTo(temp);
          
                  bool isFirstChar = true;
          
                  for (int i = indexOfComma + 1; i < temp.Length; i++)
                  {
                      if (temp[i] == ' ')
                          isFirstChar = true;
                      else if (isFirstChar)
                          isFirstChar = false;
                      else
                          temp[i] = 'X';
                  }
          
                  return new string(temp);
              }
              else
              {
                  return name.ToString();
              }
          }
          

          【讨论】:

            【解决方案6】:
            private string MaskName(string name)
            {
                var parts = name.Split(',');
                var subparts = parts[1].Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
            
                for (var i = 0; i < subparts.Length; i++)
                {
                    var subpart = subparts[i];
            
                    subparts[i] = subpart[0] + new string('X', subpart.Length - 1);
                }
            
                return parts[0] + ", " + string.Join(" ", subparts);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-12-15
              • 2017-10-19
              • 2019-11-20
              • 1970-01-01
              • 1970-01-01
              • 2017-10-27
              • 2014-12-11
              • 1970-01-01
              相关资源
              最近更新 更多