.net 如何用给定输入中的值替换给定的电子邮件地址?

nfs0ujit  于 2023-01-22  发布在  .NET
关注(0)|答案(2)|浏览(88)

我已经编写了下面所示的方法,用给定的文本替换一些电子邮件域,如@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++中也使用相同的逻辑。
vuktfyat

vuktfyat1#

为了进一步解释我的观点,我意识到使用字典并没有多大意义,因为你并不需要它提供的任何功能,你真正需要的只是一个查找替换对的列表:

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)

chhqkbe1

chhqkbe12#

谢谢你@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);
}

相关问题