Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Boost и UnicodeString 
V
    Опции темы
Валерия
Дата 25.11.2010, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Насколько я поняла, boost regex работает с std::string, но не работает с UnicodeString.
Нашла как можно отконвертировать std::string в UnicodeString.
Но вот как обратно отконвертировать UnicodeString в std::string не могу найти.
Какой самый простой вариант?
PM MAIL   Вверх
Alexeis
Дата 25.11.2010, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Валерия, и туда и обратно через .c_str() . Кстати я бы рекомендовал использовать не std::string, а std::wstring . Буст умеет работать с обоими строками. Да и вообще скорее всего он насчитан на base_string<>


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mrbrooks
Дата 25.11.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Alexeis @  25.11.2010,  07:19 Найти цитируемый пост)
и туда и обратно через .c_str() 

интересно и для этого?
Цитата(Валерия @  25.11.2010,  04:23 Найти цитируемый пост)
Но вот как обратно отконвертировать UnicodeString в std::string не могу найти.


Просто я помню в 2009 была шляпа с тем, что UnicodeString::c_str() и UnicodeString::w_str() возвращали wchar_t*


Цитата(Валерия @  25.11.2010,  04:23 Найти цитируемый пост)
Насколько я поняла, boost regex работает с std::string, но не работает с UnicodeString.

с юникодом он так же прекрасно работает, поэтому перегонять UnicodeString в ansi смысла нет.
PM MAIL   Вверх
Валерия
Дата 25.11.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Вот так работает:
Код

std::string mystring = "abctestabc";

     if (boost::regex_match(mystring, boost::regex("test"))){
        
     }

Вот так не работает:
Код

UnicodeString mystring = "abctestabc";

     if (boost::regex_match(mystring, boost::regex("test"))){
        
     }

Пишет:
Код

[BCC32 Error] gogogo.cpp(23): E2285 Could not find a match for 'boost::regex_match<BidiIterator,Allocator,charT,traits>(UnicodeString,boost::regex)'
  Full parser context
    gogogo.cpp(20): parsing: void _fastcall TForm5::Button1Click(TObject *)

PM MAIL   Вверх
xvr
Дата 25.11.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



А так:
Код

UnicodeString mystring = "abctestabc";
     if (boost::regex_match(mystring.w_str(), boost::wregex(L"test"))){
        
     }
?

PM MAIL   Вверх
Валерия
Дата 25.11.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Цитата(xvr @  25.11.2010,  12:33 Найти цитируемый пост)
А так

Вот так работает smile
Но не работает, если нужно сохранить найденное:

Код

UnicodeString content = "abcde";
boost::cmatch what;
boost::regex_search (content.w_str(), what, boost::wregex(L"a(.*?)e"));

Пишет:
Код

[BCC32 Error] gogogo.cpp(56): E2285 Could not find a match for 'boost::regex_search<BidiIterator,Allocator,charT,traits>(wchar_t *,boost::cmatch,boost::wregex)'
  Full parser context
    gogogo.cpp(51): parsing: void _fastcall TForm5::Button1Click(TObject *)

PM MAIL   Вверх
xvr
Дата 25.11.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Валерия @  25.11.2010,  14:45 Найти цитируемый пост)
Но не работает, если нужно сохранить найденное:
Код

boost::cmatch what;

Разумеется. boost::wcmatch нужен


PM MAIL   Вверх
Валерия
Дата 25.11.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Цитата(xvr @  25.11.2010,  15:36 Найти цитируемый пост)
Разумеется. boost::wcmatch нужен

Супер smile
Теперь почти работает как надо:
Код

String content = "abc='123' abb='321'";
boost::wcmatch what;
boost::regex_search (content.w_str(), what, boost::wregex(L"abc='(.*?)'"));
Edit1->Text = what[1].first;

Я использую знак вопроса в регулярка, чтобы сделать поиск "жадным"
Но в результате в what[1].first оказываеться не "123" а "123' abb='321'"
PM MAIL   Вверх
xvr
Дата 25.11.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Валерия @  25.11.2010,  16:48 Найти цитируемый пост)
Но в результате в what[1].first оказываеться не "123" а "123' abb='321'"
Надо смотреть не просто на what[1].first, а на то, что лежит между what[1].first и what[1].second
Код

String result(what[1].first,what[1].second-what[1].first);

И еще учтите (я лично наступал на эти грабли) - regex_search рассовывает в what указатели на ОРИГИНАЛЬНУЮ строку, переданную первым параметром в regex_search. Поэтому она должна быть валидна и после вызова regex_search. Т.е. вариант
Код

String some_func();
...
boost::regex_search (some_func().w_str(),...);
не пройдет!


PM MAIL   Вверх
Валерия
Дата 25.11.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Цитата(xvr @  25.11.2010,  17:27 Найти цитируемый пост)
String result(what[1].first,what[1].second-what[1].first);

Спасибо!
Вот так работает суперски smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.