2010-10-06 2 views
2

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

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

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

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

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

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

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

ответ

5

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

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

ReplaceWithXLeave4 заменяет все, кроме последних четырех символов, x. Он делает это, сопоставляя любой отдельный символ (.), используя zero-width negative lookahead assertion, чтобы выкинуть это совпадение для последних четырех символов.

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

Hi Chris. Спасибо за ответ. – Kamal

0

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

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

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

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

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

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

+0

Хорошая точка spudley. Но это не для длины пароля. Это больше для контактной информации, где некоторым отделам разрешено видеть ее, а другие - нет. Последние четыре цифры, допустимые в этом случае, представляют собой почтовый/почтовый код, который каждый имеет право видеть. Бизнес правила. – Kamal

+0

Почему бы просто не позволить им увидеть только последние четыре символа? –

+1

Как я уже сказал, деловые правила. Я не делаю их, я просто кодирую их :) – Kamal