powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Замена в строке по словарю
25 сообщений из 82, страница 2 из 4
Замена в строке по словарю
    #40131589
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Питонский вариант. Ну тоже не в 1 строку.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
dic = {'Jun':'Июнь', 'Jul':'Июль'}

def replace_all(text, dic):
    for key in dic:
        text = text.replace(key, dic[key])
    return text

replace_all("Release planned on 23-Jun-2023", dic)  

...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131607
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Питонский вариант. Ну тоже не в 1 строку.
Ну если тебе так сильно хочется, то на Перле это действительно можно уместить в одну строку:
Код: sql
1.
2.
3.
4.
5.
6.
%dic = ('Jun'=>'Июнь', 'Jul'=>'Июль');
$str = "Release planned on 23-Jun-2023";

$str =~ s/(@{[join('|', keys(%dic))]})/$dic{$1}/g;

print $str;
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131684
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Это ж мне нужно из __DATE__ выделить сокращение месяца. Написать отображение Jun -> Июнь и т.д.
А лучше по английскому сокращению месяца определить его номер. Преобразовать в дату и распечатать
месяц компиляции в текущей локали.
Если постараться, в С++ это можно сделать во время компиляции. Но не в две строчки.
https://stackoverflow.com/questions/11697820/how-to-use-date-and-time-predefined-macros-in-as-two-integers-then-stri
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131685
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот интересно если сделать кросс-компиллятор С++ => Templates/Macros C++.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131755
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
mayton
Питонский вариант. Ну тоже не в 1 строку.
Ну если тебе так сильно хочется, то на Перле это действительно можно уместить в одну строку:
Код: sql
1.
2.
3.
4.
5.
6.
%dic = ('Jun'=>'Июнь', 'Jul'=>'Июль');
$str = "Release planned on 23-Jun-2023";

$str =~ s/(@{[join('|', keys(%dic))]})/$dic{$1}/g;

print $str;


Но нам нужна динамическая генерация словаря. Как опция. Это же моветон такое писать.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131800
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Так в перле все динамическое - в рантайме строки выполняются ))
В С++ тоже ничего не мешает из словаря сделать регекс и провести замену.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131802
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav,

Так в перле все динамическое - в рантайме строки выполняются ))
В С++ тоже ничего не мешает из словаря сделать регекс и провести замену.

В классических регулярках можно проводить замену по словарю?

Но я не это имел в виду. А замену которую семантически можно было бы описать так:

Код: plaintext
Короткое английское название месяца -> Полное название месяца в текущей локали

Или из БД. Вот что я понимал под динамикой.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131819
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. у тебя самый первый пост начинается так
Допустим у нас есть ассоциативный массив std::map<std::string, std::string>
тоесть он как-бы уже задан.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131829
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Но нам нужна динамическая генерация словаря. Как опция. Это же моветон такое писать.
Чего??? Как ты собираешься делать динамическую генерацию словаря? Увидел новое слово в тексте, сразу добавил его в словарь? А на что ты новое слово заменять собираешься?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131830
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Anatoly Moskovsky
petrav,

Так в перле все динамическое - в рантайме строки выполняются ))
В С++ тоже ничего не мешает из словаря сделать регекс и провести замену.

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

petrav
Но я не это имел в виду. А замену которую семантически можно было бы описать так:

Код: plaintext
Короткое английское название месяца -> Полное название месяца в текущей локали

Или из БД. Вот что я понимал под динамикой.
Вообще-то, такая задача решается проще. Берем строку, читаем ее как дату, потом пишем эту дату в нужной локали. Текстовой заменой никто не занимается.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно тема топика про это и была. Локализовать _DATE_ + _TIME_ .
Я-бы средствами сборщиков делал. Забил-бы ункиальный плейсхолдер в исходник.
А потом за 1 миг до компилляции просто текстовой заменой вставлял бы даны в русском языке.
Типа свой пре-процессор.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131882
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl

Вообще-то, такая задача решается проще. Берем строку, читаем ее как дату, потом пишем эту дату в нужной локали. Текстовой заменой никто не занимается.

Локаль уже стоит другая, а в __DATE__ всё по "американски". :)
Я не вижу как в std::get_time() локаль передать. Но попробовать можно.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131886
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЛокаль уже стоит другая, а в __DATE__ всё по "американски". :)

Потому что так гласит стандарт:
macros__DATE__
expands to the date of translation, a character string literal of the form "Mmm
dd yyyy". The first character of "dd" is a space if the day of the month is less
than 10. The name of the month is as if generated by std::asctime()
asctimeThe function does not support localization, and the newline
character cannot be removed.

petravЯ не вижу как в std::get_time() локаль передать.
asctimePOSIX marks this function obsolete and recommends locale-dependent
std::strftime instead.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131905
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот интересно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void experimental::run()
{
#define IS_RU_STR 0

    std::setlocale(LC_TIME, "ru_RU.utf-8");

    std::tm tm{};
    char const *curr = __DATE__;
#if IS_RU_STR
    std::istringstream ss(u8"Янв 11 2022");
#else
    std::istringstream ss(curr);
#endif
    ss >> std::get_time(&tm, "%b %d %Y");

#if !IS_RU_STR
    char str[100];
    std::strftime(str, 100, "%b %d %Y", &tm);
#endif
}


Если IS_RU_STR==0 оно парсит дату по-английски, а потом печатает её по-русски.
Если IS_RU_STR==1 дату по-русски оно и не парсит.

А почему так?
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131907
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели потому, что С++ класс использует С++ локаль, а не С? Да не, это было бы
слишком просто...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131909
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Неужели потому, что С++ класс использует С++ локаль, а не С? Да не, это было бы
слишком просто...

Все функции находятся в `std`, следовательно это всё C++.
Да, кстати, MSVC + файл исходников в utf8+BOM. Но я удалил префикс u8 и ничего не изменилось. Русскую дату оно не парсит.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131912
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravВсе функции находятся в `std`, следовательно это всё C++.

Это неправильно следствие:
https://en.cppreference.com/w/cpp/locale/setlocale The setlocale function installs the specified system locale or its portion as
the new C locale.

Проверь конкретно какая локаль имбуёвана у твоего стрингстрима.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131919
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravВсе функции находятся в `std`, следовательно это всё C++.

Это неправильно следствие:
https://en.cppreference.com/w/cpp/locale/setlocale The setlocale function installs the specified system locale or its portion as
the new C locale.

Проверь конкретно какая локаль имбуёвана у твоего стрингстрима.

Да, imbue() работает. Если локаль мы можем установить локально для этого потока, то это решает проблему корректно.
Независимо от текущей глобальной локали. Спасибо!
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131923
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот. Если ставится задача прочитать из строки дату в заданной локали, но
при этом не затрагивая глобальную (установленную) локаль:

Код: plaintext
1.
2.
3.
std::istringstream ss(__DATE__ __TIME__);
ss.imbue(std::locale("en_US.utf-8"));
ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");


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

Это фигня целиком, начиная с постановки задачи. Твой файл может быть вообще не
перекомпилирован при сборке просто потому, что не изменялся.

Соответственно и решение - в системе сборки, а не исходниках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131948
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravУ меня такое ощущение, что я что-то куда-то не туда примудил.

Это фигня целиком, начиная с постановки задачи. Твой файл может быть вообще не
перекомпилирован при сборке просто потому, что не изменялся.

Соответственно и решение - в системе сборки, а не исходниках.

И каково же по вашему решение?

PS: В документации по созданию официальной сборки написано: пересобрать приложение, т.е. с нуля.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131956
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и исходники не трогать. Просто при сборке положить в Windows-ресурсы строку с датой.
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131965
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У него Линух. В винде было бы проще: там в заголовке экзешника есть специальное
поле для таймштампа сборки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131967
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так попробовать. Свой макрос.

Код: python
1.
2.
3.
4.
5.
6.
7.
#!/bin/bash

// ... set russian locale for shell

cdate=$(date +"%Y-%m-%d")

gcc petrav.c -o petrav.exe -DRUSSIAN_DATE="$(cdate)"
...
Рейтинг: 0 / 0
Замена в строке по словарю
    #40131977
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в makefile это еще проще делается.
Добавляется вот такой код:

Код: plaintext
1.
2.
3.
4.
5.
.PHONY: timestamp.h

timestamp.h: 
	@echo "Rebuilding $@"
	@echo "#define BUILD_TIME=\"`date`\"" > $@

А timestamp.h ставится пререквезитом для какого-нибудь about.cpp и инклудится в нем.
.PHONY объявляет цель как "делать всегда" и на каждый запуск make этот файл будет обновляться. А какой там формат date напечатает - зависит от его параметров, и он наследует локаль системы. Все просто и легко.

А еще туда можно запихнуть всякие
Код: plaintext
1.
2.
	@echo "#define BUILD_PLATFORM=\"`uname -m`\"" >> $@
	@echo "#define BUILD_STATION=\"`uname -n`\"" >> $@
И так далее, насколько фантазии хватит.
...
Рейтинг: 0 / 0
25 сообщений из 82, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Замена в строке по словарю
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (5), Yandex Bot 1 мин., Google Bot 6 мин., Bing Bot 7 мин.
x
x
Закрыть


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