Regex Заменить все символы в строке переменной длины - PullRequest
2 голосов
/ 06 октября 2010

Используя VB или C #, я получаю строку переменной длины из базы данных.Эта информация является конфиденциальной информацией, которую смогут увидеть только определенные пользователи.

У меня есть два случая, которые будут использовать одну и ту же логику (я думаю).

сценарий 1: заменить все символы на x

сценарий 2: заменить все символы на x, кроме последних 4 символов (предположим, длина> 4 - эта проверка выполняется).

Я подумал, что это будет проще всего с помощью Regex.Replace (вход, шаблон, замещающая строка).В отличие от большого количества операций со строками с подстроками и форсирования длины «х».

Но кажется, что регулярное выражение всегда будет моим криптонитом.

Любая помощь от гуру регулярных выражений была бы признательна,В качестве альтернативы будет приветствоваться лучшее решение.

Ответы [ 2 ]

5 голосов
/ 06 октября 2010

Я не уверен, что регулярные выражения являются лучшим подходом, но они должны работать.

ReplaceWithX заменяет каждый отдельный символ (указанный .) на x.

ReplaceWithXLeave4 заменяет все символы, кроме последних четырех, на x.Это достигается путем сопоставления любого отдельного символа (.) при использовании отрицательного прогнозирующего утверждения нулевой ширины для исключения этого совпадения для последних четырех символов.

using System;
using System.Text.RegularExpressions;

namespace ReplaceRegex
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(ReplaceWithX("12345678"));
            Console.WriteLine(ReplaceWithXLeave4("12345678"));
        }

        static string ReplaceWithX(string input)
        {
            return Regex.Replace(input, ".", "x");
        }

        static string ReplaceWithXLeave4(string input)
        {
            return Regex.Replace(input, ".(?!.{0,3}$)", "x");
        }
    }
}

И дляполнота, вот как это выглядит, если не использовать регулярные выражения.Этот подход, вероятно, несколько быстрее, чем подход регулярных выражений, даже если вы никогда не увидите разницу в производительности, если просто сделаете это один или два раза, как в этих примерах.Другими словами, если вы делаете это на сервере с большим количеством запросов, избегайте регулярных выражений, так как его читать немного легче.

using System;
using System.Text;

namespace ReplaceNoRegex
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(ReplaceWithX("12345678"));
            Console.WriteLine(ReplaceWithXLeave4("12345678"));
        }

        static string ReplaceWithX(string input)
        {
            return Repeat('x', input.Length);
        }

        static string ReplaceWithXLeave4(string input)
        {
            if (input.Length <= 4)
                return input;

            return Repeat('x', input.Length - 4)
                 + input.Substring(input.Length - 4);
        }

        static string Repeat(char c, int count)
        {
            StringBuilder repeat = new StringBuilder(count);

            for (int i = 0; i < count; ++i)
                repeat.Append(c);

            return repeat.ToString();
        }
    }
}
0 голосов
/ 06 октября 2010

Здесь стоит указать (особенно учитывая точку «скрыть все, кроме последних четырех символов»), что конфиденциальная информация также может передаваться по длине.

Например, если я достаточно хорошо знаю кого-то,узнать длину их пароля может быть достаточно для того, чтобы я мог догадаться, какой пароль они использовали;этого, безусловно, будет достаточно, чтобы сузить возможности.

Поэтому я бы посоветовал вместо простой замены символов одним и тем же числом «х», вам следует заменить его фиксированным числом «х», поэтому длинане может быть угадано.

Это становится довольно простым случаем замены строки.В действительности нет нужды в регулярных выражениях.

В случае замены всей строки просто отмените «xxxxxxxx», независимо от того, какой была исходная строка (или какой длины x вы предпочитаете).

А в случае отображения последних четырех символов, просто выведите более короткую строку из «х», за которой следуют последние четыре символа, используя substring().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...