Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Boost и UnicodeString


Автор: Валерия 25.11.2010, 04:23
Насколько я поняла, boost regex работает с std::string, но не работает с UnicodeString.
Нашла как можно отконвертировать std::string в UnicodeString.
Но вот как обратно отконвертировать UnicodeString в std::string не могу найти.
Какой самый простой вариант?

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

Автор: mrbrooks 25.11.2010, 09:19
Цитата(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 смысла нет.

Автор: Валерия 25.11.2010, 12:08
Вот так работает:
Код

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 *)

Автор: xvr 25.11.2010, 12:33
А так:
Код

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

Автор: Валерия 25.11.2010, 14:45
Цитата(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 *)

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

boost::cmatch what;

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


Автор: Валерия 25.11.2010, 16:48
Цитата(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'"

Автор: xvr 25.11.2010, 17:27
Цитата(Валерия @  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(),...);
не пройдет!


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

Спасибо!
Вот так работает суперски smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)