【问题标题】:Masking all characters of a string except for the last n characters屏蔽除最后 n 个字符之外的字符串的所有字符
【发布时间】:2013-03-07 02:57:35
【问题描述】:

我想知道如何用“除了最后一个数字字符”的条件替换字符串中的字符?

例子:

string = "4111111111111111";

我想做到这一点

new_string = "XXXXXXXXXXXXX1111"

在本例中,我将字符替换为“X”,最后 4 个字符除外。

我怎样才能做到这一点?

【问题讨论】:

  • 你的意思是每次最后四个字符
  • @tariq,它不固定。不是每次
  • 那么是什么决定了你想显示多少个字符

标签: c# string


【解决方案1】:

这适合你吗?

var input = "4111111111111111";
var length = input.Length;
var result = new String('X', length - 4) + input.Substring(length - 4);

Console.WriteLine(result);

// Ouput: XXXXXXXXXXXX1111

【讨论】:

  • 这个解决方案对我来说效果很好,而且很简洁。谢谢!
【解决方案2】:

比如...

new_string = new String('X', YourString.Length - 4)
                  + YourString.Substring(YourString.Length - 4);

根据当前字符串的长度创建一个新字符串 -4 并将其全部设为“X”。然后添加原始字符串的最后 4 个字符

【讨论】:

  • 这是我见过的最漂亮的实现。太棒了。你做了什么让我在 1 中写了 7 行。
【解决方案3】:

这是一种思考的方法。呼叫最后一个数字字符离开n

  1. X 将替换多少个字符?字符串长度减去n
  2. 如何将字符替换为其他字符?您不能直接修改 string,但可以新建一个。
  3. 如何从原始字符串中获取最后一个n 字符?有几种方法可以做到这一点,但最简单的可能是Substring,它允许我们通过指定起点和可选的终点来抓取字符串的一部分。

所以它看起来像这样(其中n 是从原始字符中离开的字符数,str 是原始字符串 - string 不能是变量的名称,因为它是保留关键字):

// 2. Start with a blank string
var new_string = "";

// 1. Replace first Length - n characters with X
for (var i = 0; i < str.Length - n; i++)
    new_string += "X";

// 3. Add in the last n characters from original string.
new_string += str.Substring(str.Length - n);

【讨论】:

  • @cheol.lui,这可能对你有用,但在创建变量、循环和常量字符串 + 一次一个字符以及垃圾收集方面有点过头了......是的,这个描述适用于给你一个心理“如何解决”,但绝对没有其他选项那么有效。
【解决方案4】:

对于您的要求,这可能有点矫枉过正。但这里有一个快速的扩展方法可以做到这一点。

它默认使用 x 作为掩码字符,但可以使用可选字符进行更改

   public static class Masking
{
    public static string MaskAllButLast(this string input, int charsToDisplay, char maskingChar = 'x')
    {
        int charsToMask = input.Length - charsToDisplay;
        return charsToMask > 0 ? $"{new string(maskingChar, charsToMask)}{input.Substring(charsToMask)}" : input;
    }
}

这里有一个单元测试来证明它有效

 using Xunit;

    namespace Tests
{
    public class MaskingTest
    {
        [Theory]
        [InlineData("ThisIsATest", 4, 'x', "xxxxxxxTest")]
        [InlineData("Test", 4, null, "Test")]
        [InlineData("ThisIsATest", 4, '*', "*******Test")]
        [InlineData("Test", 16, 'x', "Test")]
        [InlineData("Test", 0, 'y', "yyyy")]
        public void Testing_Masking(string input, int charToDisplay, char maskingChar, string expected)
        {
            //Act
            string actual = input.MaskAllButLast(charToDisplay, maskingChar);

            //Assert
            Assert.Equal(expected, actual);
        }
    }
}

【讨论】:

    【解决方案5】:
    StringBuilder sb  = new StringBuilder();
    Char[] stringChar = string.toCharArray();
    for(int x = 0; x < stringChar.length-4; x++){
        sb.append(stringChar[x]);
    }
    sb.append(string.substring(string.length()-4));
    
    string = sb.toString();
    

    【讨论】:

      【解决方案6】:

      这里的一些其他简洁答案没有考虑少于 n 个字符的字符串。这是我的看法:

       var length = input.Length;                
       input = length > 4 ? new String('*', length - 4) + input.Substring(length - 4) : input;
      

      【讨论】:

        【解决方案7】:

        我猜你可以将Select 与索引一起使用

        string input = "4111111111111111";
        string new_string = new string(input.Select((c, i) => i < input.Length - 4 ? 'X' : c).ToArray());
        

        【讨论】:

          【解决方案8】:

          刘, 请试试这个...

          string dispString = DisplayString("4111111111111111", 4);
          

          创建一个传递原始字符串且没有数字的函数。

              public string DisplayString(string strOriginal,int lastDigit)
              {
                  string strResult = new String('X', strOriginal.Length - lastDigit) + strOriginal.Substring(strOriginal.Length - lastDigit);
                  return strResult;
              }
          

          可能对你有帮助....

          【讨论】:

            【解决方案9】:

            试试这个:

            String maskedString = "...."+ (testString.substring(testString.length() - 4, testString.length()));
            

            【讨论】:

              【解决方案10】:

              聚会迟到了,但我还想屏蔽除最后一个“x”字符之外的所有字符,但只屏蔽数字或字母,以便仍然显示任何 - ( )、其他格式等。这是我的快速扩展方法 - 希望它可以帮助某人。我从 Luke Hammer 的示例开始,然后根据我的需要改变了胆量。

              public static string MaskOnlyChars(this string input, int charsToDisplay, char maskingChar = 'x')
                  {
                      StringBuilder sbOutput = new StringBuilder();
                      int intMaskCount = input.Length - charsToDisplay;
              
                      if (intMaskCount > 0) //only mask if string is longer than requested unmasked chars
                      {
                          for (var intloop = 0; intloop < input.Length; intloop++)
                          {
                              char charCurr = Char.Parse(input.Substring(intloop, 1));
                              byte[] charByte = Encoding.ASCII.GetBytes(charCurr.ToString());
                              int intCurrAscii = charByte[0];
              
                              if (intloop <= (intMaskCount - 1))
                              {
                                  switch (intCurrAscii)
                                  {
                                      case int n when (n >= 48 && n <= 57):
                                          //0-9
                                          sbOutput.Append(maskingChar);
                                          break;
              
                                      case int n when (n >= 65 && n <= 90):
                                          //A-Z
                                          sbOutput.Append(maskingChar);
                                          break;
              
                                      case int n when (n >= 97 && n <= 122):
                                          //a-z
                                          sbOutput.Append(maskingChar);
                                          break;
              
                                      default:
                                          //Leave other characters unmasked
                                          sbOutput.Append(charCurr);
                                          break;
                                  }
                              }
                              else
                              {
                                  //Characters at end to remain unmasked
                                  sbOutput.Append(charCurr);
                              }
                          }
                      }
                      else
                      {
                          //if not enough characters to mask, show unaltered input
                          return input;
                      }
                      return sbOutput.ToString();
                  }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-11-08
                • 2019-07-05
                • 2020-02-10
                • 2018-05-28
                • 1970-01-01
                • 1970-01-01
                • 2011-12-07
                • 1970-01-01
                相关资源
                最近更新 更多