powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / std:regexp
17 сообщений из 17, страница 1 из 1
std:regexp
    #39256454
crimeperson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, имеется строка типа std::string, в ней несколько слов на кириллице, разделенных символом запятой.
Нужно посредством std:regexp прочитать все слова и сохранить в массив, при этом исключая символы запятой.
У меня имеется код, но он работает только с латинице, подскажите как его переделать под кириллицу.

std::regex tml("\\w+");
std::string str = "Word,word,word";
std::vector<std::string> vec;

std::sregex_iterator rei(str.begin(), str.end(), tml);
std::sregex_iterator end;

while (rei != end)
{
std::smatch match = *rei;
//vec.push_back(match.str());
wxMessageDialog msg(NULL, match.str()); msg.ShowModal();
rei++;
}
...
Рейтинг: 0 / 0
std:regexp
    #39256697
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[а-яА-Я]+
...
Рейтинг: 0 / 0
std:regexp
    #39256727
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы достаточно задать кодировку строки.
Как это делается -- погляди в моём примере тут

http://www.sql.ru/forum/1199792/sostavlenie-slovarya-teksta-s-chastotnostu-upotrebleniya
...
Рейтинг: 0 / 0
std:regexp
    #39256728
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не только кодировку. Надо ещё строки поменять на широкие.
...
Рейтинг: 0 / 0
std:regexp
    #39258285
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе, не только кодировку. Надо ещё строки поменять на широкие.кодировка-то наверное будет utf8
...
Рейтинг: 0 / 0
std:regexp
    #39258372
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackMasterZivНе, не только кодировку. Надо ещё строки поменять на широкие.кодировка-то наверное будет utf8

Кодировка внешнего файла будет utf8.
Кодировка данных в памяти должна быть utf-32, по-другому средствами библиотек С++ работать с тестом не получится.
Ну или расскажи, как, я такого способа не знаю.
...
Рейтинг: 0 / 0
std:regexp
    #39258374
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
странно это.. кодировка utf8 расчитана на один байт на символ, а не на два.

вот это не работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
#include <regex>
#include <iostream>

using char_type=wchar_t;
using str_type = std::basic_string<char_type>;
auto& cout = std::wcout;

int main (int argc, char** argv) {
    std::setlocale(LC_ALL, NULL);
    std::ios_base::sync_with_stdio(false);
    cout.imbue( std::locale("ru_RU.UTF-8") );

    std::basic_regex<char_type> tmpl(L"\\w+");
    str_type str=L"word,work,работа";
    std::vector<str_type> result;

    std::regex_iterator<str_type::const_iterator> rei(str.begin(),str.end(),tmpl);
    std::regex_iterator<str_type::const_iterator> end;

    while(rei!=end) {
        std::match_results<str_type::const_iterator> match=*rei;
        result.push_back(match.str());
        rei++;
    }

    for(auto r:result) cout << r << std::endl;

    return 0;
}

выводит два слова на латинице (установку кодировки я взял перейдя по ссылки)
...
Рейтинг: 0 / 0
std:regexp
    #39258376
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот это работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
#include <regex>
#include <iostream>

using char_type=char;
using str_type = std::basic_string<char_type>;
auto& cout = std::cout;

int main (int argc, char** argv) {
    //std::setlocale(LC_ALL, NULL);
    //std::ios_base::sync_with_stdio(false);
    //cout.imbue( std::locale("ru_RU.UTF-8") );

    std::basic_regex<char_type> tmpl("[^\\s]+");
    str_type str="word work работа";
    std::vector<str_type> result;

    std::regex_iterator<str_type::const_iterator> rei(str.begin(),str.end(),tmpl);
    std::regex_iterator<str_type::const_iterator> end;

    while(rei!=end) {
        std::match_results<str_type::const_iterator> match=*rei;
        result.push_back(match.str());
        rei++;
    }

    for(auto r:result) cout << r << std::endl;

    return 0;
}

...
Рейтинг: 0 / 0
std:regexp
    #39258377
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, оказывается выражение [a-zа-я]+ работает если установить кодировку. так что MasterZiv прав.. просто классы символов не работают (может баг компилятора?).
...
Рейтинг: 0 / 0
std:regexp
    #39258379
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackкодировка utf8 расчитана на один байт на символ, а не на два.
это неправда, либо криво сформулировано

один байт на символ только для ASCII (0-127)
для остальных 2-4 байта
...
Рейтинг: 0 / 0
std:regexp
    #39258380
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

название utf8 как бы намикает...
если использовать только латиницу, то кол-во байт будет такое же как кол-во символов.
...
Рейтинг: 0 / 0
std:regexp
    #39258381
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а.. я понял в чем подвох..
не работают не строки, а std::regex, вернее isalpha - эта функция не возращает верного значения когда символ занимает больше места чем планировалось. так что если указать верные char_traits то все должно быть ок и без мароки с кодировками.

приду попробую.
...
Рейтинг: 0 / 0
std:regexp
    #39258383
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackесли использовать только латиницу, то кол-во байт будет такое же как кол-во символов.
а вся нелатиница (non ASCII, с единичным старшим битом) - может трактоваться как неведома зверушка,
соответсвенно "классы символов не работают "
...
Рейтинг: 0 / 0
std:regexp
    #39258497
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackстранно это.. кодировка utf8 расчитана на один байт на символ, а не на два.

Ну, ты неправ, а код я не глядел.
...
Рейтинг: 0 / 0
std:regexp
    #39258498
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackо, оказывается выражение [a-zа-я]+ работает если установить кодировку. так что MasterZiv прав.. просто классы символов не работают (может баг компилятора?).

Классы символов как работают -- надо читать в документации на конкретную библиотеку REGEXP.
И видимо чтобы она работала, как-то её настраивать.

Как это всё работает --- ещё раз, погляди в моём примере, он рабочий.
...
Рейтинг: 0 / 0
std:regexp
    #39258499
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackа.. я понял в чем подвох..
не работают не строки, а std::regex, вернее isalpha - эта функция не возращает верного значения когда символ занимает больше места чем планировалось. так что если указать верные char_traits то все должно быть ок и без мароки с кодировками.

приду попробую.

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

Надо поставить локейл правильный, и кодировку исходного файла, если я правильно помню.
...
Рейтинг: 0 / 0
std:regexp
    #39258529
5677
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
using namespace std;

vector<wstring> split(const wstring& input, const wstring& regex) {
    wregex re(regex);
    wsregex_token_iterator first{input.begin(), input.end(), re, 0},  last;
    return {first, last};
}
int main() {
    setlocale(LC_ALL, "Russian");
    auto tml(L"[а-я]+");
    auto str(L"просто,просто,просто,просто,просто,просто,просто,просто,просто");
    auto vec=split(str,tml);
    for (auto  str:vec){
        wcout<<str<<endl;
    }
    return 0;
}
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / std:regexp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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