基于谓词替换QString中的元素

时间:2012-02-22 18:16:54

标签: c++ qt std qstring

我需要根据QString替换字符 QChar::category。在stdlib术语中我想

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有关,还是我真的需要转动字符串 在std::vector<QChar>和后面?

编辑:我想要保留的类别

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

我可以先做多次通过/休息。

1 个答案:

答案 0 :(得分: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惯用语。

请注意,从字符串中删除符号的速度较慢,然后添加new(如果保留了空格),这就是第一个代码示例速度很快的原因。