2015-01-08 4 views
0

Я пытаюсь заменить текст. Я использую словарь для задания.C# Замена строки в цикле Foreach

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); 
} 

Проблема

Если Звоню метод на aa строке, происходит следующее:

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

возвращается «Юниор»

Однако, когда я печатаю

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

Я получаю результат: «Младший меньше ср.»

Почему цикл компрометирует задачу?

ответ

5

Вы должны передать ключ в словаре (который содержит текст для поиска), а не реальную строку, которую Вы ищете в

Оно должно быть:.

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

В отличие чтобы:

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

вы в настоящее время заменить вашу строку со значением «Юниор», потому что вы указали вашей строки как текст для поиска. (Который заставит его заменить всю строку, а не только ключевое слово)

+0

Вау, я плотный. Извините за упрямый вопрос, но спасибо за быстрый ответ. Мои глаза устали. – Bryant

+0

Рад, что я мог бы помочь! Не волнуйтесь, это случается со всеми нами :) – Cyral

0

В реализации pureString я думаю, что вы сделали ошибку при вызове BlindReplace. Вместо:

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

Я считаю, что вы должны были назвать:

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

+0

Обратите внимание, что несколько раз дать тот же ответ через 40 минут ... Особенно с худшим форматированием. Если вы не планируете значительно улучшить ответ, чтобы сделать его выше старшего, я бы рекомендовал его удалить. –

Смежные вопросы