powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Замена в строке по словарю
25 сообщений из 82, страница 1 из 4
Замена в строке по словарю
    #40131260
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у нас есть ассоциативный массив std::map<std::string, std::string> который определяет замены, которые нужно провести в строке.

Неужели не существует готового модуля? Посмотрел в Boost.StringAlgo вроде ничего не нашёл.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131264
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Готовый модуль для одного простейшего цикла? Нынешние программисты совсем
обленились...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131265
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Готовый модуль для одного простейшего цикла? Нынешние программисты совсем
обленились...

Так в Boost.StringAlgo тоже не сказать что бы сложные алгоритмы. Зачем нужна эта библиотека?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131266
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Готовый модуль для одного простейшего цикла? Нынешние программисты совсем
обленились...

На самом деле тут не все так просто с циклом:
1. Надо словарь отсортировать от длинных строк к коротким, т.к. короткая может сократиться, а потом длинная не совпадет, т.е. компаратор надо свой.
2. Одного цикла мало, т.к. если в цикле произошло сокращение, то надо еще один цикл, вдруг в результате сокращения сформировалась другая строка из словаря.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131271
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это проблемы составляющего словарь замен и список правил замены.

Потому-то и нет готового модуля, что у каждого требования свои.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131298
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут важно в каком порядке заменять. Я как-то раз по молодости делал из строки XML строку ....

Вобщем надо было амперсанд заменить на & ну и другие кавычки и знаки больше-меньше.

Можете себе представить что будет после
Код: plaintext
1.
& -> &amp;


и еще раз.

Короче Марковские алгоритмы отдыхали. Я переполнил память :)
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131312
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

2. Одного цикла мало, т.к. если в цикле произошло сокращение, то надо еще один цикл, вдруг в результате сокращения сформировалась другая строка из словаря.

Вот это самый интересный момент.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131315
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

боюсь спросить - а что за самый интересный момент?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131317
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гарантии того что алгоритм когда-то остановится.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131321
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Гарантии того что алгоритм когда-то остановится.

В обычном языке имеет смысл только сокращение, поэтому исходная подстрока должна быть больше замены. В таком случае гарантированно остановится.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131323
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте послушаем как себе это видит автор.

Для меня цена вопроса - в замене

Код: plaintext
1.
a -> b, b -> c, c -> a



Будем ли мы по 1 разу применять каждую замену? Или возможен вариант что
после того как все замены закончились - в строке внезапно появятся новые подстроки
которые снова открывают возможности к заменам.

Понятно что такая циклическая замена как я описал - безсмысленна. Но проговорить ее стоит
т.к. это вопрос стабильности API.

Чтоб не было строк-осцилляторов.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131326
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я решал задачу сокращения наименований товаров. Чтобы оно компактнее было, в ячейку грида на экране влезало как можно больше и т.п.
Тут бессмысленна замена подстроки на равную по длине.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131327
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из последних таких задач я помню надо было просто ключевые слова SQL такие как USER, TABLE, ORDER
в динамических запросах заменять на закавыченные.

И из логов пароли выкидывать. На звездочки ****** заменять. Ну и всякую sensitive-инфу. Личные данные там.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131332
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Это проблемы составляющего словарь замен и список правил замены.

Потому-то и нет готового модуля, что у каждого требования свои.

Спорное утверждение. Такие языки как XML схема и регулярные выражения тоже
не всем требованиям удовлетворяют, однако они существуют и востребованы…

PS: Нужно просто в макросе __DATE__ заменить месяцы. Jun -> Июнь. :)
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131360
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получилось у меня на лямбдах. Да и std::string оказался дремучий. Я совсем забыл что в нем нету replace_all.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using namespace std;

bool replace(string& expr, const string& from, const string& to) {
    size_t start_pos = expr.find(from);
    if(start_pos == string::npos)
      return false;
    expr.replace(start_pos, from.length(), to);
    return true;
}

string replace_all(string expr, const map<string,string>& replacement) {
  for(auto const& [key, val] : replacement)
    while(replace(expr, key, val));
  return expr;
}

int main(int argc, char **argv) {
  map<string, string> months = {{"политический авантюрист","господин президент"},{"SUN","Oracle"},{"Cool","Ice"}};
  cout << replace_all("Hey, SUN is Cool!", months) << endl;
  return 0;
}
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131375
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravСпорное утверждение. Такие языки как XML схема и регулярные выражения тоже не
всем требованиям удовлетворяют, однако они существуют и востребованы…

Потому что у них есть чёткие спецификации. У твоей задачи их нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131376
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное в Perl такая задача решается кратко.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131422
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Лично я решал задачу сокращения наименований товаров. Чтобы оно компактнее было, в ячейку грида на экране влезало как можно больше и т.п.
Тут бессмысленна замена подстроки на равную по длине.
Ну это только один из вариантов, когда используется замена. А если мы к примеру хотим в шаблоне заменить плейсхоледы на данные, нам наверное не надо, чтобы в уже подставленных данных снова искались плейсхолдеры?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131423
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО если надо просто заменить одну подстроку на другую в один проход, то доп.билиотек не надо никаких, даже если нет готовой функции для этого, то она пишется в пару строк.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131453
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего удивительного в таких запросах нет.
Порог вхождения в программисты настолько упал, что в npm например даже есть модуль is-odd.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131482
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Ничего удивительного в таких запросах нет.
Порог вхождения в программисты настолько упал, что в npm например даже есть модуль is-odd.

Ничего себе, я вам идею подарил на новый язык а-ля регулярные выражения. А Вы мне «начинающий программист».
Московский, в историю можете войти…

Это ж мне нужно из __DATE__ выделить сокращение месяца. Написать отображение Jun -> Июнь и т.д.
А лучше по английскому сокращению месяца определить его номер. Преобразовать в дату и распечатать
месяц компиляции в текущей локали. Потом запихнуть это в значение возвращённое __DATE__.

Я устану это программировать. :)
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131484
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Всё что было похоже на оффтоп - поудалял.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131582
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНаверное в Perl такая задача решается кратко.
посмотрел в сторону Perl -
не увидел что в языке Practical Extraction Report Language
это может решатся кратко.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131585
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тут важно в каком порядке заменять. Я как-то раз по молодости делал из строки XML строку ....

Вобщем надо было амперсанд заменить на & ну и другие кавычки и знаки больше-меньше.

Можете себе представить что будет после
Код: plaintext
1.
& -> &amp;


и еще раз.

Короче Марковские алгоритмы отдыхали. Я переполнил память :)
это судя по всему и есть Нормальные Алгорифмы Маркова

Тьюринг-полные, кстати

petrav, есть такой язык программирования - Рефал

что-то мне подсказывает, что самые эффективные его компиляторы делают дет. конечный автомат
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131588
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как-то я property менял в старых проектах. Точно не помню но как-то так.

Код: plaintext
1.
sed -i "s/Jun/Июнь/g" file.properties


Есть у утилиты брат-близнец awk. Делает примерно то-же. Но это всё мелочи по сравнению с Perl.
Насколько я разбираюсь он поглощает и покрывает все опции этих утилит и скриптует их исполнение в коде.

Я не утверждаю что в Перле это будет в 1 строку но должно быть побогаче чем sed. Особенно если у нас
задан справочник месяцев.
...
Рейтинг: 0 / 0
25 сообщений из 82, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Замена в строке по словарю
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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