Boost.regex с поддержкой icu с использованием именованных групп захвата

Ниже тестовая программа использует поддержку именованных захватов в boost-regex для извлечения полей года, месяца и дня из даты (просто для иллюстрации использования именованных захватов):

#include <boost/regex.hpp>
#include <boost/regex/icu.hpp>

#include <string>
#include <iostream>

int main(int argc, const char** argv)
{
std::string   str = "2013-08-15";
boost::regex  rex("(?<year>[0-9]{4}).*(?<month>[0-9]{2}).*(?<day>[0-9]{2})");
boost::smatch res;

std::string::const_iterator begin = str.begin();
std::string::const_iterator end   = str.end();

if (boost::regex_search(begin, end, res, rex))
{
std::cout << "Day:   " << res ["day"] << std::endl
<< "Month: " << res ["month"] << std::endl
<< "Year:  " << res ["year"] << std::endl;

}
}

Составлено с

g++ regex.cpp -lboost_regex -lboost_locale -licuuc

Эта маленькая программа выдаст следующий результат:

$ ./a.out
Day:   15
Month: 08
Year:  2013

Затем я заменяю обычные части регулярных выражений их аналогами u32regex:

#include <boost/regex.hpp>
#include <boost/regex/icu.hpp>

#include <string>
#include <iostream>

int main(int argc, const char** argv)
{
std::string   str = "2013-08-15";
boost::u32regex  rex = boost::make_u32regex("(?<year>[0-9]{4}).*(?<month>[0-9]{2}).*(?<day>[0-9]{2})", boost::regex_constants::perl);
boost::smatch res;

std::string::const_iterator begin = str.begin();
std::string::const_iterator end   = str.end();

if (boost::u32regex_search(begin, end, res, rex))
{
std::cout << "Day:   " << res ["day"] << std::endl
<< "Month: " << res ["month"] << std::endl
<< "Year:  " << res ["year"] << std::endl;

}
}

Сборка работающей программы теперь приводит к исключению времени выполнения, предполагающему неинициализированный shared_ptr:

$ ./a.out
a.out: /usr/include/boost/smart_ptr/shared_ptr.hpp:648: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = boost::re_detail::named_subexpressions; typename boost::detail::sp_member_access<T>::type = boost::re_detail::named_subexpressions*]: Assertion `px != 0' failed.

Я не использую общие указатели напрямую, хотя.

Это с бустом 1.58.1 и gcc 5.3.1.

Как я могу получить версию программы u32regex, которая также работает правильно?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]