C# 用*遮罩字符串的前12个字符?

C# 用*遮罩字符串的前12个字符?,c#,.net,c#-4.0,C#,.net,C# 4.0,如何将值1234567890123345或12345678900123456转换为: *************2345和*************3456 上述字符串之间的区别是一个包含15位,另一个包含16位 我尝试了以下方法,但它没有保留15位数字的最后4位,现在不管字符串的长度是多少,无论是13、14、15还是16,我都想用*来屏蔽所有起始数字,但保留最后4位。以下是我尝试过的: String.Format("{0}{1}", "************", str.Substring(

如何将值
1234567890123345
12345678900123456
转换为:

*************2345
*************3456

上述字符串之间的区别是一个包含15位,另一个包含16位

我尝试了以下方法,但它没有保留15位数字的最后4位,现在不管字符串的长度是多少,无论是13、14、15还是16,我都想用*来屏蔽所有起始数字,但保留最后4位。以下是我尝试过的:

String.Format("{0}{1}", "************", str.Substring(11, str.Length - 12))
试试这个:

var maskSize = ccDigits.Length - 4;
var mask = new string('*', maskSize) + ccDigits.Substring(maskSize);
林克:

charmaskby='*';
字符串输入=“123456789012345”;
int count=输入。长度i<计数?maskBy:c);

最简单的方法:创建一个扩展方法来提取最后四位数字。在String.Format调用中使用它

例如:

public static string LastFour(this string value)
{
    if (string.IsNullOrEmpty(value) || value.length < 4)
    {
        return "0000";
    }
    return value.Substring(value.Length - 4, 4) 
}
在我看来,这将导致更可读的代码,并且它是可重用的

编辑:也许不是最简单的方法,但可能是产生更易维护结果的替代方法

尝试以下操作:

    private string MaskString(string s)
    {
        int NUM_ASTERISKS = 4;

        if (s.Length < NUM_ASTERISKS) return s;

        int asterisks = s.Length - NUM_ASTERISKS;
        string result = new string('*', asterisks);
        result += s.Substring(s.Length - NUM_ASTERISKS);
        return result;
    }
私有字符串掩码字符串(字符串s)
{
int NUM_星号=4;
如果(s.Length
带有匹配计算器的正则表达式将完成此工作

string filterCC(string source) {
  var x=new Regex(@"^\d+(?=\d{4}$)");
  return x.Replace(source,match => new String('*',match.Value.Length));
}
这将匹配任意数量的数字,后跟4位数字和结尾(替换中不包括4位数字)。replace函数将用长度相等的*字符串替换匹配项

这还有一个额外的好处,您也可以将其用作验证算法。将第一个+更改为{11,12},使其匹配总共15或16个字符,然后可以使用
x.IsMatch
确定有效性

编辑

或者,如果您总是想要16个字符的结果,只需使用

 return x.Replace(source,new String('*',12));
简单的方法

   string s = "1234567890123"; // example
   int l = s.Length;
   s = s.Substring(l - 4);
   string r = new string('*', l);
   r = r + s;
试试这个:

static string Mask(string str)
{
    if (str.Length <= 4) return str;
    Regex rgx = new Regex(@"(.*?)(\d{4})$");
    string result = String.Empty;
    if (rgx.IsMatch(str))
    {
        for (int i = 0; i < rgx.Matches(str)[0].Groups[1].Length; i++)
            result += "*";
        result += rgx.Matches(str)[0].Groups[2];
        return result;
    }
    return str;
}
静态字符串掩码(字符串str)
{
如果(str.Length像这样:

string s = "1234567890123"; // example
string result = s.Substring(s.Length - 4).PadLeft(s.Length, '*');
这将屏蔽字符串中除最后四个字符外的所有字符。它假定源字符串至少有4个字符长。

/“123456789”。MaskFront将导致“*****56789”
private string MaskDigits(string input)
{
    //take first 6 characters
    string firstPart = input.Substring(0, 6);

    //take last 4 characters
    int len = input.Length;
    string lastPart = input.Substring(len - 4, 4);

    //take the middle part (****)
    int middlePartLenght = len - (firstPart.Length + lastPart.Length);
    string middlePart = new String('*', middlePartLenght);

    return firstPart + middlePart + lastPart;
}

MaskDigits("1234567890123456");

// output : "123456******3456"
公共静态字符串MaskFront(此字符串str、int len、char c) { var strArray=str.ToCharArray(); 对于(变量i=0;i-1) { strArray[tracker]=c; 跟踪器--; } 其他的 { 打破 } } 返回字符串。Join(“,strArray); }
用发送字符从开始到结束屏蔽

public static string Maskwith(this string value, int fromStart, int fromEnd, char ch)
    {
        return (value?.Length >= fromStart + fromEnd) ?
             string.Concat(Enumerable.Repeat(ch, fromStart)) + value.Substring(fromStart, value.Length - (fromStart + fromEnd)) + string.Concat(Enumerable.Repeat(ch, fromEnd))
             : "";
    } //Console.WriteLine("mytestmask".Maskwith(2,3,'*')); **testm***
通过传递值和遮罩中间,从开始和结束显示字符

 public static string MasktheMiddle(this string value, int visibleCharLength, char ch)
    {
        if (value?.Length <=  (visibleCharLength * 2))
            return string.Concat(Enumerable.Repeat(ch,value.Length));
        else
            return value.Substring(0, visibleCharLength) + string.Concat(Enumerable.Repeat(ch, value.Length - (visibleCharLength * 2))) + value.Substring(value.Length - visibleCharLength);

    } //Console.WriteLine("mytestmask".MasktheMiddle(2,'*')); Result: my******sk
公共静态字符串MasktheMiddle(此字符串值,int visibleCharLength,char ch)
{


如果(值?.Length你想让它屏蔽任意数量的数字,但只显示最后四位吗?@Anjunal-是的,我想屏蔽所有数字,而不考虑长度。你能发布该
字符串的上下文吗?格式化
调用?在测试应用程序中对我来说很好,所以你的问题在别处。它有效,但当我在15位n上使用它时umber它只显示了最后3个字符,我想现在显示所有4个字符,不管字符串有多长。添加了我的函数,目标是灵活性。想解释下一票吗?他显然在处理信用卡号码。可重用性是一个问题。我喜欢扩展方法,但只需要在一个地方显示,所以一行就更好了。UpvoteIn我的经验经验,你认为你只在一个地方需要它。:-)为什么你要从string.Format改为string.Concat,在这个场景中,它创建了一个17个字符长的字符串,13*,以及最后4位数字。我刚刚在PadLeft函数中将13改为12,这似乎很管用。
新字符串('*',12)
可能比
更容易阅读。PadLeft(12,“*”)
@BobVale-使用这两种方法都有性能或好处吗?我认为在空字符串常量上调用PadLeft看起来有点不确定。为什么不只使用str.Substring(str.Length-4)。PadLeft(16,“*”)这就是我想要的,但我认为这更优雅。很好!这可以工作,但创建的字符串都是17个字符长。真的吗?我似乎得到了15或16个,这取决于。相对于这13个长度值
2222221
,它返回17个字符。我喜欢它,但我已经用返回输入替换了charactersToShowAtEnd=input.length;-)通常,最好解释一个解决方案,而不是仅仅发布几行匿名代码
static string Mask(string str)
{
    if (str.Length <= 4) return str;
    Regex rgx = new Regex(@"(.*?)(\d{4})$");
    string result = String.Empty;
    if (rgx.IsMatch(str))
    {
        for (int i = 0; i < rgx.Matches(str)[0].Groups[1].Length; i++)
            result += "*";
        result += rgx.Matches(str)[0].Groups[2];
        return result;
    }
    return str;
}
string s = "1234567890123"; // example
string result = s.Substring(s.Length - 4).PadLeft(s.Length, '*');
private string MaskDigits(string input)
{
    //take first 6 characters
    string firstPart = input.Substring(0, 6);

    //take last 4 characters
    int len = input.Length;
    string lastPart = input.Substring(len - 4, 4);

    //take the middle part (****)
    int middlePartLenght = len - (firstPart.Length + lastPart.Length);
    string middlePart = new String('*', middlePartLenght);

    return firstPart + middlePart + lastPart;
}

MaskDigits("1234567890123456");

// output : "123456******3456"
// "123456789".MaskFront results in "****56789"
public static string MaskFront(this string str, int len, char c)
    {
        var strArray = str.ToCharArray();

        for (var i = 0; i < len; i++)
        {
            if(i < strArray.Length)
            {
                strArray[i] = c;
            }
            else
            {
                break;
            }
        }

        return string.Join("", strArray);
    }

// "123456789".MaskBack results in "12345****"
public static string MaskBack(this string str, int len, char c)
{
    var strArray = str.ToCharArray();

    var tracker = strArray.Length - 1;
    for (var i = 0; i < len; i++)
    {
        if (tracker > -1)
        {
            strArray[tracker] = c;
            tracker--;
        }
        else
        {
            break;
        }
    }

    return string.Join("", strArray);
}
public static string Maskwith(this string value, int fromStart, int fromEnd, char ch)
    {
        return (value?.Length >= fromStart + fromEnd) ?
             string.Concat(Enumerable.Repeat(ch, fromStart)) + value.Substring(fromStart, value.Length - (fromStart + fromEnd)) + string.Concat(Enumerable.Repeat(ch, fromEnd))
             : "";
    } //Console.WriteLine("mytestmask".Maskwith(2,3,'*')); **testm***
 public static string MasktheMiddle(this string value, int visibleCharLength, char ch)
    {
        if (value?.Length <=  (visibleCharLength * 2))
            return string.Concat(Enumerable.Repeat(ch,value.Length));
        else
            return value.Substring(0, visibleCharLength) + string.Concat(Enumerable.Repeat(ch, value.Length - (visibleCharLength * 2))) + value.Substring(value.Length - visibleCharLength);

    } //Console.WriteLine("mytestmask".MasktheMiddle(2,'*')); Result: my******sk