Как замаскировать строку после первого символа - PullRequest
1 голос
/ 17 февраля 2020

Допустим, у меня есть строка, состоящая из имени человека:

var name = "Jason, Bruno Mars";

Как мне замаскировать string с X для имени после запятой и возвращает:

var name = "Jason, BXXXX MXXX";

Я пытался использовать следующие методы, но маскируются только передние символы:

string first, second, output;
bool hasSpace, hasComma;
int int_LENGTH;
var name = "Jason, Bruno Mars";
hasComma = name.Contains(",");

if (hasComma == true)
{
    int_LENGTH = name.IndexOf(",");
    if (int_LENGTH > 0)
    {
        first = name.Substring(0, int_LENGTH);
    }

    second = string.Join(",", name.Split(" ").Skip(1));
    hasSpace = second.Contains(" ");

    if (hasSpace == true)
    {
        second = string.Concat(new string('X', 12), second.Substring(second.Length - 4));
        output = first + "," + second;
    }
}

У кого-то есть лучшее представление о том, как можно добиться того же результата более эффективным способом?

Ответы [ 6 ]

1 голос
/ 17 февраля 2020

Другой вариант, используя Regex.Matches , чтобы выбрать части имени, кроме первой буквы. Регулярное выражение собирает все строковые части, разделенные пробелом, пропуская то, что находится перед запятой.
Коллекции Matches затем передаются в метод Linq Aggregate () для выполнения подстановки.
A StringBuilder используется для хранения строк, сгенерированных его собственным Replace () метод:

string theName = "Jason Et Alt., Bruno Mars And More Names";
var matches = Regex.Matches(theName, @"(?!.*?,)\s+?.(\w+)");

string outName = matches.OfType<Match>().Aggregate(new StringBuilder(theName), (sb, m) => 
   sb.Replace(m.Groups[1].Value, new string('X', m.Groups[1].Length))).ToString();

outname = Jason Et Alt., BXXXX MXXX AXX MXXX NXXXX
0 голосов
/ 17 февраля 2020

Эффективный способ маскировки без Split, Regex и using System.Linq:

Для C# версия <7.2: </strong>

static string MaskName(string name)
{
    int indexOfComma = name.IndexOf(',');

    if (indexOfComma != -1)
    {
        char[] temp = name.ToCharArray();

        bool isFirstChar = true;

        for (int i = indexOfComma + 1; i < temp.Length; i++)
        {
            if (temp[i] == ' ')
                isFirstChar = true;
            else if (isFirstChar)
                isFirstChar = false;
            else
                temp[i] = 'X';
        }

        return new string(temp);
    }
    else
    {
        return name;
    }
}

Для C# версия> = 7.2:

static string MaskName(ReadOnlySpan<char> name)
{
    int indexOfComma = name.IndexOf(',');

    if (indexOfComma != -1)
    {
        Span<char> temp = stackalloc char[name.Length];

        name.CopyTo(temp);

        bool isFirstChar = true;

        for (int i = indexOfComma + 1; i < temp.Length; i++)
        {
            if (temp[i] == ' ')
                isFirstChar = true;
            else if (isFirstChar)
                isFirstChar = false;
            else
                temp[i] = 'X';
        }

        return new string(temp);
    }
    else
    {
        return name.ToString();
    }
}
0 голосов
/ 17 февраля 2020

Попробуйте

1002 *
0 голосов
/ 17 февраля 2020
Using This code..

    static string MaskName(string name)
    {
        string maskedString = string.Empty;

        string[] names = name.Split(',');
        if (names.Length > 0)
        {
            maskedString = names[0] + ",";
        }
        if (names.Length > 1)
        {
            string[] arrName = names[1].Split(' ');
            foreach (string s in arrName)
            {
                if (s.Length > 0)
                    maskedString += " " + s[0].ToString().PadRight(s.Length, 'X');
            }
        }
        return maskedString;
    }

Выход: - enter image description here

0 голосов
/ 17 февраля 2020
static string MaskName(string name)
    {
        string maskedString = string.Empty;

        string[] names = name.Split(',');
        if (names.Length > 0)
        {
            maskedString = names[0] + ",";
        }
        if (names.Length > 1)
        {
            string[] arrName = names[1].Split(' ');
            foreach (string s in arrName)
            {
                if (s.Length > 0)
                    maskedString += " " + s[0].ToString().PadRight(s.Length, 'X');
            }
        }
        return maskedString;
    }
0 голосов
/ 17 февраля 2020
private string MaskName(string name)
{
    var parts = name.Split(',');
    var subparts = parts[1].Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);

    for (var i = 0; i < subparts.Length; i++)
    {
        var subpart = subparts[i];

        subparts[i] = subpart[0] + new string('X', subpart.Length - 1);
    }

    return parts[0] + ", " + string.Join(" ", subparts);
}
...