2

我需要QString根据它们 替换 a 中的字符QChar::category。用标准库术语我想

string.erase(std::remove_if(begin(string), end(string), 
                            [](QChar c) { 
                            QChar::Category cat = c.category(); 
                            return cat == .... || cat == ...; }), 
             string.end());

或者,我对适用于 unicode 字符类别的正则表达式感到满意,我可以将其用于QString::replace.

QString 是否有可能,还是我真的需要将字符串转回 astd::vector<QChar>并返回?

编辑:我想保留的类别:

  • 第一个字符:$、_ 或 Unicode 类别中的任何字符“大写字母 (Lu)”、“小写字母 (Ll)”、“标题字母 (Lt)”、“修饰符字母 (Lm)”、“其他字母 (Lo)”或“字母编号 (Nl)”</li>
  • 其余的:第一个项目符号加上任何 U+200C 零宽度非连接字符、U+200D 零宽度连接字符和 Unicode 类别“非间距标记 (Mn)”、“间距组合标记 (Mc) ”、“十进制数字 (Nd)”或“连接符标点 (Pc)”。

我可以在多个通道中进行第一次/休息。

4

1 回答 1

4

Qt 提供了自己的方式来做这些事情。它是否好是值得怀疑的,但 Qt 惯用语会是

QString result;
result.reserve(string.size());
foreach (const QChar& c, string) {
    if (is_good(c)) {
        result += c;
    }
}

当然,你可以用 lambdas 和std::for_each

std::for_each(string.begin(), string.end(),
                  [&result](QChar c)
                    {
                        if (is_good(c)) {result += c; }
                    }
    );

但这不是Qt惯用的。

请注意,从字符串中删除符号较慢,如果保留空间,则添加新符号,这就是第一个代码示例速度快的原因。

于 2012-02-22T18:38:04.047 回答