3

Boost 1.48.0では、これは正規表現コード(boost / regex / v4 / w32_regex_traits.hpp)にあります。

w32_regex_traits()
      : m_pimpl(re_detail::create_w32_regex_traits<charT>(::boost::re_detail::w32_get_default_locale()))
   { }
//...//
BOOST_REGEX_DECL lcid_type BOOST_REGEX_CALL w32_get_default_locale()
{
    return ::GetUserDefaultLCID();
}

常に米国のロケールを設定したいので、このw32_get_default_locale()をオーバーライドする必要があります。ソースコードを変更せずにこれを行うにはどうすればよいですか?

4

1 に答える 1

3

正規表現ベースのオブジェクトごとにロケールを設定することができます(これをチェックして、落とし穴がないか確認してください)。

boost::regex re;
re.imbue(std::locale("es_ES.UTF-8")); // or whatever you want
re.assign("[a-z]*"); // Important - assign after imbue!

また、正規表現オブジェクトごとにBoostXpressiveを使用してこれを行う方法があります。

#include <locale>
#include <boost/xpressive/xpressive.hpp>
...
// Declare a regex_compiler that uses a custom std::locale
std::locale loc; /* ... create a locale here ... */;
boost::xpressive::regex_compiler<char const *, boost::xpressive::cpp_regex_traits<char> > cpprxcomp(loc);
boost::xpressive::cregex cpprx = cpprxcomp.compile( "\\w+" );

// or (after using boost::xpressive)
sregex cpprx2 = imbue(loc)( +_w );
于 2012-04-10T22:21:17.610 に答える