提升正则表达式:[:alpha:]和重音字符

时间:2014-02-24 13:56:24

标签: c++ regex boost internationalization

我正在尝试使用Boost:

替换字符串中的每个非字母字符" "
std::string sanitize(std::string &str)
{
    boost::regex re;
    re.imbue(std::locale("fr_FR.UTF-8"));
    re.assign("[^[:alpha:]]");
    str = boost::regex_replace(str, re, " ");
    return str;
}


int main ()
{
    std::string test = "(ça) /.2424,@ va très bien ?";
    cout << sanitize(test) << endl;
    return 0;
}

结果是a va tr s bien,但我想获得ça va très bien

我错过了什么?

1 个答案:

答案 0 :(得分:6)

boost::regex::imbue并没有做你希望的事情 - 特别是,它不会使boost :: regex与UTF-8一起工作。 (您可以使用ISO 8859-1或类似的单字节字符编码使其工作,但这似乎不是您想要的)。

对于UTF-8支持,您需要使用一个处理Unicode的boost :: regex类 - 请参阅http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/unicode.html

以下是一些我认为可以做到的代码:

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

std::string sanitize(std::string &str)
{
    boost::u32regex re = boost::make_u32regex("[^[:alpha:]]");
    str = boost::u32regex_replace(str, re, " ");
    return str;
}


int main ()
{
    std::string test = "(ça) /.2424,@ va très bien ?";
    std::cout << test << "\n" << sanitize(test) << std::endl;
    return 0;
}

有关更多示例,请参阅http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/ref/non_std_strings/icu/unicode_algo.html