powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
10 сообщений из 10, страница 1 из 1
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38537421
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет !

Имеется строка (простой текстовый файл, но я его считываю его в строку). В ней много сокращений вида <!Val1!>, <!Val2!> в тексте.

Также имеется словарь, где указано что на что заменять.
Код: c#
1.
2.
<!Val1!> = Hello
<!Val2!> = World



Т.е. в итоге нужно из этого

Код: c#
1.
<!Val1!>, <!Val2!> ! 


получить
Код: c#
1.
Hello World !



У меня идея решения есть, но какая-то слишком глупая:
В цикле вызвать String.Replace каждый раз передавая новое значение замены.

С учетом того, что файл занимает несколько Кб, получим кучу мусорных строк на каждой итерации.

Как то можно это сделать оптимальней ?
PS. Может можно прямо в файле все эти замены сделать ? или все же проще загрузить его в строку ?
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38537449
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй StringBuilder. Замены текста с помощью его метода Replace будут происходить без создания новых строк. Перевыделение памяти может быть, но в любом случае гораздо меньше, чем при использовании string.Replace.

WPF ПадаванPS. Может можно прямо в файле все эти замены сделать ?
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38537450
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
Dictionary<string, string> d = new Dictionary<string,string>();
d.Add("Val1", "hello");
d.Add("Val2", "world");
string s = Regex.Replace("<!Val1!>, <!Val2!> ! ", "<!([^!]+)!>", (Match m) => d[m.Groups[1].Value]);
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38537451
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WPF ПадаванМожет можно прямо в файле все эти замены сделать ?скорее всего, не получится. например, "<!Val1!>" не заменить на "Hello" - разное количество символов (байт), хвост придется сдвинуть
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38537464
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Яростный Меч,

Оу ! Регулярные выражения это мощь ! Это то, что нужно !
Именно, что хотелось - чтобы все было за один проход (полагаю сам регэксп оптимизирован, и за один проход все находит).
Чувствовал, что есть решение проще, но не большой специалист в регулярках и не придумал бы сам :)

Спасибо Вам большое :)

PS. А, ну да. Я забыл что в файле все четко разложено поочередно, и изменить что-то можно только таким же размером.

Именно поэтому в древние времена локализаторы, которые русифицировали проги прямо через ресурсы EXE, были вынуждены делать смешные сокращения :) Да и сейчас наверное так делают, если программа не дружелюбна к локализации.
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38538351
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите я сейчас сильно туплю.

В общем формат изменился. Т.к. он должен быть в XML, то решено не использовать <

Сейчас формат ##Слово##.

Пытаюсь использовать такой шаблон
Regex.Replace(XmlText, @"###(\w+)###", (Match m) => dict[m.Groups[1].Value]);

Но при этом, вылетает такое исключение: "KeyNotFoundException: Данный ключ отсутствует в словаре."


Я проверил. В словаре dict хранятся правильные значения. Т.е. пары "##Test1##,'Замена этой фразой1'".

И я не понял, что означает ([^!]+) в Вашем шаблоне ?

PS. Не понятно, на какой именно ключ ругается. Черт.
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38538354
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я подозреваю, что # что-то означает в регулярных выражениях. Нет ?

Если да, то нужно как то его экранировать, Блин.
Буду искать сейчас, но подскажите пожалуйста, если кто знает )
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38538370
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WPF Падаван,

для разбора xml лучше использовать xml-парсер.

Покажи формат xml.
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38538688
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WPF ПадаванЯ подозреваю, что # что-то означает в регулярных выражениях. Нет ?
Это комментарий

экранирующий символ "\"
...
Рейтинг: 0 / 0
Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
    #38538717
WPF Падаван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отбой отбой. Ложная тревога с моей стороны.
Все великолепно ! :)

Регулярные выражения действительно рулят !
В общем ошибка была моя. Я не добавил в словарь пару слов под замену. И поэтому и вылетала ошибка, что ключ не найден в этом месте:
Код: c#
1.
d[m.Groups[1].Value]



Т.к. нужно было срочно все сделать - я пошел по пути: в цикле делать String.Replace :)
И уже там, в цикле, посмотрел как все конвертится, и увидел что пары значений нет в словаре.
Добавил их в словарь Dictionary<string, string> d

И... И Регулярки, с шаблоном
Код: c#
1.
@"\#\#\#(\w+)\#\#\#"

отлично отработались!

Я в итоге просто сравнил две строки - та, что создается регулярками, и та, что у меня получалась в результате ручного StringReplace в цикле.
Так они абсолютно идентичные вышли - диффер никаких отличий не увидел.

Надо изучить регулярки. Полезная штука )
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать String.Replace но по массиву (т.е. много pair-value правил замены) ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]