使用正则表达式进行SSN屏蔽

时间:2012-03-06 10:11:38

标签: regex

我试图掩盖“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方法在一行中有更好的方法吗。

2 个答案:

答案 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的六种方法进行了比较。