我试图掩盖“123-12-1234”到“XXX-XX-1234”的SSN。我可以使用下面的代码。
string input = " 123-12-1234 123-11-1235 ";
Match m = Regex.Match(input, @"((?:\d{3})-(?:\d{2})-(?<token>\d{4}))");
while (m.Success)
{
if (m.Groups["token"].Length > 0)
{
input = input.Replace(m.Groups[0].Value,"XXX-XX-"+ m.Groups["token"].Value);
}
m = m.NextMatch();
}
使用Regex.Replace方法在一行中有更好的方法吗。
答案 0 :(得分:5)
您可以尝试以下操作:
string input = " 123-12-1234 123-11-1235";
string pattern = @"(?:\d{3})-(?:\d{2})-(\d{4})";
string result = Regex.Replace(input, pattern, "XXX-XX-$1");
Console.WriteLine(result); // XXX-XX-1234 XXX-XX-1235
答案 1 :(得分:0)
如果你要进行大量的掩蔽,你应该考虑一些是否使用编译的正则表达式。
使用它们会在首次运行应用程序时引起轻微延迟,但随后会更快地运行。
还应考虑选择正则表达式的静态vs实例。
我发现以下是最有效的
public class SSNFormatter
{
private const string IncomingFormat = @"^(\d{3})-(\d{2})-(\d{4})$";
private const string OutgoingFormat = "xxxx-xx-$3";
readonly Regex regexCompiled = new Regex(IncomingFormat, RegexOptions.Compiled);
public string SSNMask(string ssnInput)
{
var result = regexCompiled.Replace(ssnInput, OutgoingFormat);
return result;
}
}
对正则表达式检查/屏蔽here的六种方法进行了比较。