Replace заменяет не все слова в StringBuilder - C#
Формулировка задачи:
Доброго времени суток!
Имеется код, по сути написанный правильно. Правильно-в смысле того, что по идее он должен работать, но он работает только частично.
Это кусок кода от более крупной лабораторной. В переменной text_from_file пример текста, в массиве top_words 3 "самых употребляемых" слова. С помощью регулярного выражения эти слова по очереди ищутся в тексте. Ищутся хорошо,правильно и находятся все, которые должны находиться. Но Replace заменяет не все слова, в чём можно убедиться, выполнив программу и посмотрев результат.
В чём проблема, или мой недочёт?
Заранее спасибо.
using System;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] top_words = new[] {"в","и","Windows"};
StringBuilder text_from_file = new StringBuilder("В Windows XP существуют специальные папки с именами \"Мои документы\", \"Мои рисунки\" и \"Моя музыка\". В Windows Vista имена этих папок не содержат слова \"Мои\" — они называются просто \"Документы\", \"Рисунки\" и \"Музыка\". Однако код, о котором идет речь в этом занятии, будет выполняться и в Windows XP, и в Windows Vista. Файлов файла");
for (int wrd = 0; wrd < top_words.Length; wrd++)
{
string reg = "(\\b)(" + top_words[wrd] + ")(\\b)";
Regex r = new Regex(reg, RegexOptions.IgnoreCase);
MatchCollection matches = r.Matches(text_from_file.ToString());
foreach (Match mch in matches)
{
text_from_file = text_from_file.Replace(mch.Value, "Замененоооооооо", mch.Index, mch.Value.Length);
}
}
Console.WriteLine(text_from_file);
Console.ReadKey();
}
}
}
Исходный текст
В Windows XP существуют специальные папки с именами "Мои документы", "Мои рисунки" и "Моя музыка". В Windows Vista имена этих папок не содержат слова "Мои" — они называются просто "Документы", "Рисунки" и "Музыка". Однако код, о котором идет речь в этом занятии, будет выполняться и в Windows XP, и в Windows Vista. Файлов файла
Результат
Замененоооооооо Замененоооооооо XP существуют специальные папки с именами "Мои документы", "Мои рисунки" Замененоооооооо "Моя музыка". В Windows Vista имена этих папок не содержат слова "Мои" — они называются просто "Документы", "Рисунки" и "Музыка". Однако код, о котором идет речь в этом занятии, будет Замененооооооооыполняться и в Windows XP, и в Windows Vista. Файлов файла
Решение задачи: «Replace заменяет не все слова в StringBuilder»
textual
Листинг программы
string str = "В Windows XP существуют специальные папки с именами \"Мои документы\", \"Мои рисунки\" и \"Моя музыка\". В Windows Vista имена этих папок не содержат слова \"Мои\" — они называются просто \"Документы\", \"Рисунки\" и \"Музыка\". Однако код, о котором идет речь в этом занятии, будет выполняться и в Windows XP, и в Windows Vista. Файлов файла"; StringBuilder text_from_file = new StringBuilder(Regex.Replace(str, @"\b(в|и|Windows)\b", "Замененоооооооо", RegexOptions.IgnoreCase));