我需要替换 a 中的字符 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字符类别的REGEXP感到满意 QString::replace.

是QString可能的吗?还是我真的需要将字符串转换为 std::vector<QChar> 然后回来?

编辑:我想要的类别 保持:

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

我可以在多遍中进行第一/休息。

有帮助吗?

解决方案

Qt 提供了自己的方法来完成此类事情。它是否好是值得怀疑的,但 Qt 惯用的做法是

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

当然,您可以使用 lambda 来实现 std::for_each

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

但事实并非如此 Qt 惯用的。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top