用 * 屏蔽字符串的前 12 个字符

本文关键字:字符 屏蔽 字符串 | 更新日期: 2023-09-27 18:21:41

如何将值1234567890123451234567890123456转换为:

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

上述字符串之间的区别在于一个包含 15 位数字,另一个包含 16 位数字。

我已经尝试了以下内容,但它不保留 4 位数字的最后 15 位数字,现在无论字符串的长度如何,无论是 13、14、15 还是 16,我想用 * 屏蔽所有开始数字,但保留最后 4 位。 这是我尝试过的:

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

用 * 屏蔽字符串的前 12 个字符

像这样:

string s = "1234567890123"; // example
string result = s.Substring(s.Length - 4).PadLeft(s.Length, '*');

这将屏蔽字符串的最后四个字符以外的所有字符。 它假定源字符串的长度至少为 4 个字符。

using System;
class Program
{
    static void Main()
    {
        var str = "1234567890123456";
        if (str.Length > 4)
        {
            Console.WriteLine(
                string.Concat(
                    "".PadLeft(12, '*'), 
                    str.Substring(str.Length - 4)
                )
            );
        }
        else
        {
            Console.WriteLine(str);
        }
    }
}

最简单的方法:创建一个扩展方法来提取最后四位数字。在 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) 
}

在您的代码中:

String.Format("{0}{1}", "************", str.LastFour());

在我看来,这会导致代码更具可读性,并且它是可重用的。

编辑:也许不是最简单的方法,但另一种可能产生更易于维护的结果的方法。 <耸耸肩 />

试试这个:

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

LINQ:

char maskBy = '*'; 
string input = "123456789012345";
int count = input.Length <= 4 ? 0 : input.Length - 4; 
string output = new string(input.Select((c, i) => i < count ? maskBy : c).ToArray()); 
static private String MaskInput(String input, int charactersToShowAtEnd)
{
  if (input.Length < charactersToShowAtEnd)
  {
    charactersToShowAtEnd = input.Length;
  }
  String endCharacters = input.Substring(input.Length - charactersToShowAtEnd);
  return String.Format(
    "{0}{1}", 
    "".PadLeft(input.Length - charactersToShowAtEnd, '*'), 
    endCharacters
    );
}

根据需要调整函数头,调用方式:

MaskInput("yourInputHere", 4);
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"

尝试以下操作:

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

带有比赛评估器的正则表达式将完成这项工作

string filterCC(string source) {
  var x=new Regex(@"^'d+(?='d{4}$)");
  return x.Replace(source,match => new String('*',match.Value.Length));
}

这将匹配任意数量的数字,后跟 4 位数字和结尾(它不会在替换中包含 4 位数字(。替换函数会将匹配项替换为长度相等的 * 字符串。

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

编辑

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

 return x.Replace(source,new String('*',12));
// "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);
}

试试这个:

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

从开始到结束的掩码,发送字符

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

如何将值123456789012345或1234567890123456转换为:

****

****2345 和 ****3456

另一种方法可以做到这一点:

var result = new string('*',0,value.Length - 4) + new string(value.Skip(value.Length - 4).ToArray())

或使用字符串。加入

使用 C# 8 的索引和范围的扩展方法:

public static string MaskStart(this string input, int showNumChars, char maskChar = '*') =>
    input[^Math.Min(input.Length, showNumChars)..]
        .PadLeft(input.Length, maskChar);

一个简单的方法

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