正则表达式替换可变长度字符串中的所有字符

时间:2010-10-06 07:51:10

标签: c# regex vb.net string

使用VB或C#,我从数据库中获取一个可变长度的字符串。此信息是只有特定用户才能看到的敏感信息。

我有两种情况会使用相同的逻辑(我认为)。

方案1:用x

替换所有字符

方案2:用最后4个字符替换除x之外的所有字符(假设长度> 4 - 正在进行此检查)。

我认为使用Regex.Replace(输入,模式,替换字符串)最容易。与使用子串进行大量字符串处理并强制使用'x'的长度相反。

但似乎Regex永远是我的氪石。

正如大羚羊大师的任何帮助将不胜感激。或者,欢迎更好的解决方案。

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

这里值得指出(特别是考虑到“隐藏除了最后四个字符之外的所有字符”这一点)敏感信息也可以通过其长度给出。

例如,如果我认识某人相当好,找出他们的密码长度可能足以让我能够很好地猜测他们使用的密码;它肯定足以帮助缩小可能性。

因此我建议而不是简单地用相同数量的'x替换字符,你应该用固定数量的'x替换,所以不能猜测长度。

这就变成了一个非常简单的字符串替换案例。根本不需要正则表达式。

在替换整个字符串的情况下,只需取消“xxxxxxxx”,无论原始字符串是什么(或者您喜欢的任何长度的'x')。

如果显示最后四个字符,只需使用substring()输出一个较短的'x'后跟最后四个字符的字符串。