如何将给定的电子邮件地址替换为给定输入中的值



我已经编写了如下所示的方法,用给定的文本替换一些电子邮件域,如@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);
}

最新更新