屏蔽除最后n个字符之外的字符串的所有字符

时间:2013-03-07 02:57:36

标签: c# string

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

示例:

string = "4111111111111111";

我想做到这一点

new_string = "XXXXXXXXXXXXX1111"

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

我怎么可能实现这个目标?

10 个答案:

答案 0 :(得分:19)

这适合你吗?

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

Console.WriteLine(result);

// Ouput: XXXXXXXXXXXX1111

答案 1 :(得分:10)

怎么样......

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

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

答案 2 :(得分:7)

这是一种思考它的方法。拨打最后一个数字字符以离开n

  1. X将替换多少个字符?字符串的长度减去n
  2. 我们如何用其他字符替换字符?您无法直接修改string,但可以构建新的。{/ li>
  3. 如何从原始字符串中获取最后n个字符?有几种方法可以做到这一点,但最简单的可能是Substring,它允许我们通过指定起点和可选的结束点来获取字符串的一部分。
  4. 所以它看起来像这样(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);
    

答案 3 :(得分:2)

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();

答案 4 :(得分:1)

我猜你可以使用Select索引

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

答案 5 :(得分:1)

吕 请尝试一下......

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;
    }

可能会帮助你......

答案 6 :(得分:1)

这可能对您的要求有些过分。但是这里有一个快速扩展方法可以做到这一点。

它默认使用x作为掩盖字符Char,但是可以用可选的char更改

   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);
        }
    }
}

答案 7 :(得分:1)

此处其他一些简明的答案并未说明少于n个字符的字符串。这是我的看法:

new string()

答案 8 :(得分:0)

尝试一下:

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

答案 9 :(得分:0)

晚了聚会,但我也想屏蔽除最后一个'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();
    }