Замена слова/подстроки в строке из Dictionary (Regex IgnoreCase?)

391
08 декабря 2017, 01:43

Здравствуйте. Имеется строка, например:

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

Но проблема в том, что я ловлю только слова, которые отделяются пробелами.

Answer 1

Пишем функцию, которая будет заменять вхождение ключа на значение для одной строки

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;
}
READ ALSO
SVG-графика (.NET, C#)

SVG-графика (.NET, C#)

Имеется xml-документ с несколькими элементами rect и lineВозможно ли получить доступ к редактированию любого из этих элементов при открытии соответствующего...

244
Список посещенных сайтов

Список посещенных сайтов

Пытаюсь сделать программу для отображения списка посещенных сайтовИдея такова, что пользователи пользуясь браузерами, все сайты сохранялись...

245
Функционал граф. векторного редактора

Функционал граф. векторного редактора

Нужно дополнить простой существующий графредактор новым функционалом: сохранение и загрузка фигур в векторном представлении

191
Размер игры Unity3D

Размер игры Unity3D

У меня игра , 40МБ веситСоздаю 8 сцен (уровней)(в сцене пару панелек) и при билде + 20Мб соответственно, выходит 60МБ как так то?Какие есть варианты...

208