Здравствуйте. Имеется строка, например:
string text = "test12345";
или
string text = "tEsT 12345";
ну или
string text = "12312TEST123423";
и так далее.
Имеется Dictionary<string, string>
. Например:
{
{ "one", "two" },
{ "test", "replaced" }
}
Нужно заменить слова в строке, используя правила моего словаря.
UPDATED:
Например:
OneONe Testte ONE словоONe
=> twotwo replacedte two словоtwo
,
Обычная строкаTEsT
=> Обычная строкаreplaced
,
OneONE ONEONE oneoneoneoneone
=> twotwo twotwo twotwotwotwotwo
,
...
Слово в словаре - всегда в lowercase. Слово в строке может быть в любом виде, отделяться и не отделяться пробелами, и так далее. Как это можно реализовать? Пока-что сейчас так:
static readonly Regex re = new Regex(@"\b(\w+)\b", RegexOptions.Compiled);
private static Dictionary<string, string> _forbiddenWords = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
//словарь
}
public static string CheckForbiddenWords(this string message)
{
string output = re.Replace(message, match => _forbiddenWords.ContainsKey(match.Groups[1].Value) ? _forbiddenWords[match.Groups[1].Value] : match.Groups[1].Value);
return output;
}
Но проблема в том, что я ловлю только слова, которые отделяются пробелами.
Пишем функцию, которая будет заменять вхождение ключа на значение для одной строки
string ReplaceInWord(string word, Dictionary<string, string> dictionary)
{
var result = word;
foreach(var item in dictionary)
{
result = Regex.Replace(result, item.Key, item.Value, RegexOptions.IgnoreCase);
}
return result;
}
Запускаем
var dictionary = new Dictionary<string, string>()
{
{ "one", "two" },
{ "test", "replaced" }
};
var words = new[]
{
"OneONe Testte ONE словоONe",
"Обычная строкаTEsT",
"OneONE ONEONE oneoneoneoneone"
};
foreach(var word in words)
{
Console.WriteLine(ReplaceInWord(word, dictionary));
}
Получаем вывод
twotwo replacedte two словоtwo
Обычная строкаreplaced
twotwo twotwo twotwotwotwotwo
Есть ещё другой вариант - без регеспов. Выбирайте какой вам больше подходит под задачу
string ReplaceInWord(string word, Dictionary<string, string> dictionary)
{
var result = word;
foreach(var item in dictionary)
{
var ind = result.IndexOf(item.Key, StringComparison.InvariantCultureIgnoreCase);
while(ind >= 0)
{
var left = result.Substring(0, ind);
var right = result.Substring(ind + item.Key.Length, result.Length - ind - item.Key.Length);
result = left + item.Value + right;
ind = result.IndexOf(item.Key, StringComparison.InvariantCultureIgnoreCase);
}
}
return result;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется xml-документ с несколькими элементами rect и lineВозможно ли получить доступ к редактированию любого из этих элементов при открытии соответствующего...
Пытаюсь сделать программу для отображения списка посещенных сайтовИдея такова, что пользователи пользуясь браузерами, все сайты сохранялись...
Нужно дополнить простой существующий графредактор новым функционалом: сохранение и загрузка фигур в векторном представлении
У меня игра , 40МБ веситСоздаю 8 сцен (уровней)(в сцене пару панелек) и при билде + 20Мб соответственно, выходит 60МБ как так то?Какие есть варианты...