Здравствуйте. Имеется строка, например:
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;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости