【问题标题】:Boost regex: [:alpha:] and accented characters提升正则表达式:[:alpha:] 和重音字符
【发布时间】:2014-02-24 13:56:24
【问题描述】:

我正在尝试使用 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

我错过了什么?

【问题讨论】:

  • 旁注:在 PCRE 中,您将使用 u 标志来获得所需的结果。我一直在搜索 boost 库,但找不到任何有希望的东西。另一方面,您可能想在表达式[^[:alpha:]]+ 中添加一个加号,然后您必须从左/右修剪空格。 Demo
  • 感谢@HamZa 的提示!

标签: c++ regex boost internationalization


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多