C#在Foreach循环中替换字符串

时间:2015-01-08 22:42:52

标签: c#

我试图替换文字。我正在使用字典来完成任务。

public static string cleanString(this String str) {

    Dictionary<string, string> dict = new Dictionary<string,string>();
    dict.Add("JR", "Junior");
    dict.Add("SR", "Senior");

    foreach (KeyValuePair<string,string> d in dict) {
        if (str.BlindContains(p.Key)) {
            str = str.BlindReplace(str, p.Value);
        }
    }

    return str;
}

BlindContains和BlindReplace只是忽略替换的情况(并且BC确保字符串不是另一个单词的一部分):

public static bool BlindContains(this String str, string toCheck)
{
    if (Regex.IsMatch(str, @"\b" + toCheck + @"\b", RegexOptions.IgnoreCase))
        return str.IndexOf(toCheck, StringComparison.OrdinalIgnoreCase) >= 0;
    return false;
}
public static string BlindReplace(this String str, string oldStr, string newStr)
{
    return Regex.Replace(str, oldStr, newStr, RegexOptions.IgnoreCase);
}

问题

如果我在字符串上调用我的方法,则会发生以下情况:

string mystring = "The jr. is less than the sr."
mystring.cleanString()

返回&#34; Junior&#34;

然而,当我打印

Console.WriteLine(Regex.Replace(mystring, "jr.", "junior", Regex.IgnoreCase));

我得到输出:&#34;大三小于sr。&#34;

为什么循环会破坏任务?

2 个答案:

答案 0 :(得分:5)

您应该在字典中传递密钥(其中包含要搜索的文本),而不是您要搜索的实际字符串。

应该是:

str = str.BlindReplace(p.Key, p.Value);

相反:

str = str.BlindReplace(str, p.Value);

您目前正在使用值“Junior”替换字符串,因为您将 字符串指定为要搜索的文本。 (这将使它替换整个字符串而不仅仅是关键字)

答案 1 :(得分:0)

在cleanString实现中,我认为你在调用BlindReplace时出错了。而不是:

str = str.BlindReplace(str,p.Value);

我相信你应该打电话:

str = str.BlindReplace(d.Key,d.Value);