我想知道如何用“除了最后一个数字字符”的条件替换字符串的字符?
例子:
string = "4111111111111111";
我想做到这一点
new_string = "XXXXXXXXXXXXX1111"
在此示例中,我将字符替换为“X”,最后 4 个字符除外。
我怎么可能做到这一点?
那会适合你吗?
var input = "4111111111111111";
var length = input.Length;
var result = new String('X', length - 4) + input.Substring(length - 4);
Console.WriteLine(result);
// Ouput: XXXXXXXXXXXX1111
怎么样...之类的
new_string = new String('X', YourString.Length - 4)
+ YourString.Substring(YourString.Length - 4);
根据当前字符串 -4 的长度创建一个新字符串,并将其全部设为“X”。然后添加原始字符串的最后 4 个字符
这是一种思考的方法。呼叫最后一个数字字符离开n
:
X
?字符串减去的长度n
。string
,但可以构建一个新的。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);
对于您的要求,这可能有点矫枉过正。但这里有一个快速的扩展方法可以做到这一点。
它默认使用 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);
}
}
}
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();
这里的其他一些简洁答案没有考虑少于 n 个字符的字符串。这是我的看法:
var length = input.Length;
input = length > 4 ? new String('*', length - 4) + input.Substring(length - 4) : input;
我想你可以使用Select
index
string input = "4111111111111111";
string new_string = new string(input.Select((c, i) => i < input.Length - 4 ? 'X' : c).ToArray());
lui,请试试这个...
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;
}
可能对你有帮助......
尝试这个:
String maskedString = "...."+ (testString.substring(testString.length() - 4, testString.length()));
派对迟到了,但我还想屏蔽除最后一个“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();
}