我已经编写了如下所示的方法,用给定的文本替换一些电子邮件域,如@gmail.com
和@yahoo.com
:
public static string RemovePersonalInfo(string input)
{
string[] tokens = input.Split(new char[] { ' ', 't', 'r', 'n' });
string output = string.Empty;
foreach (string token in tokens)
{
if (token.Contains("@gmail.com"))
{
output += " SOMETEXT";
}
else
{
output += " " + token;
}
}
tokens = output.Split(new char[] { ' ', 't', 'r', 'n' });
output = string.Empty;
foreach (string token in tokens)
{
if (token.Contains("@yahoo.com"))
{
output += " SOMETEXT";
}
else
{
output += " " + token;
}
}
return output;
}
对于以下输入,它正在按预期工作。
但我认为这不是一个好的解决方案,我可以看到代码中的改进,但它是不可扩展的,让我们看看明天会有其他电子邮件域,我将不得不再次修改代码并编写另一个if条件。第二个改进是我运行了两次循环,可以在一个循环中完成。从而可以提高性能。
或者,如果有比这更好的方法,请提出建议。
输入:
test@gmail.com test@abc.com @teest@yahoo.com
输出:
SOMETEXT test@abc.com SOMETEXT
注意:我不应该使用Replace方法。因此,这里唯一的意图是在C和C++等基本编程语言中使用相同的逻辑。
为了扩展我的评论,我意识到使用Dictionary并没有什么意义,因为您不需要它提供的任何功能。您真正需要的只是一个查找替换对的列表:
public static string RemovePersonalInfo(string input)
{
//this is just hardcoded for purposes of the question. Consider putting it in config file or DB etc.
//It's simply a list of Find/Replace pairs
(string F, string R)[] frs = {
( "@yahoo.com", "SOMETEXT" ),
( "@gmail.com", "SOMEOTHERTEXTMAYBE" )
};
string[] tokens = input.Split(' ', 't', 'r', 'n');
var outputSb = new StringBuilder();
foreach (string token in tokens) {
var fr = frs.FirstOrDefault(t => token.Contains(t.F));
outputSb.Append(" ").Append(fr == default ? token : fr.R);
}
return outputSb.ToString();
}
实际的配对可以来自配置、数据库、代码等
如果SOMETEXT总是相同的,那么您可以使用一个简单的字符串枚举:
public static string RemovePersonalInfo(string input, string sometext)
{
//this is just hardcoded for purposes of the question. Consider putting it in config file or DB etc
var ws = new[]{"@yahoo.com","@gmail.com"};
string[] tokens = input.Split(' ', 't', 'r', 'n');
var outputSb = new StringBuilder();
foreach (string token in tokens)
outputSb.Append(" ").Append(ws.Any(w => token.Contains(w)) ? sometext : token);
return outputSb.ToString();
}
如果输出不应该有前导空间,则使用outputSb.ToString(1, sb.Length-1)
谢谢@Caius,你的回答真的帮助了我。
我也尝试了以下方法来解决这个问题。我已经对示例中的值进行了硬编码,但这些值可以进行配置。
public static string RemovePersonalInfo(string input)
{
if (input == null) { throw new NullReferenceException(nameof(input)); }
if (string.IsNullOrWhiteSpace(input)) { return input; }
return RemovePersonalInfo(input.Split(new char[] { ' ', 't', 'r', 'n' }), new string[] { "@gmail.com", "@yahoo.com" });
}
private static string RemovePersonalInfo(IEnumerable<string> tokens, IEnumerable<string> domains, string replacement = "SOMETEXT")
{
return string.Join(" ", tokens.Select(token => (domains.Any(domain => token.Contains(domain)) ? replacement : token)));
}
public static string RemovePersonalInfoUsingRegex(string input)
{
//Regex and SOMETEXT can come from the configurartion
return Regex.Replace(input, @"(?<=s+|^)(S+(@gmail.com|@yahoo.com))(?=s+|$)", "SOMETEXT", RegexOptions.IgnoreCase);
}