使用VB或C#,我从数据库中获取一个可变长度的字符串。此信息是只有特定用户才能看到的敏感信息。
我有两种情况会使用相同的逻辑(我认为)。
方案1:用x
替换所有字符方案2:用最后4个字符替换除x之外的所有字符(假设长度> 4 - 正在进行此检查)。
我认为使用Regex.Replace(输入,模式,替换字符串)最容易。与使用子串进行大量字符串处理并强制使用'x'的长度相反。
但似乎Regex永远是我的氪石。
正如大羚羊大师的任何帮助将不胜感激。或者,欢迎更好的解决方案。
答案 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'后跟最后四个字符的字符串。