我需要根据QString
中的字符CCD_ 2。在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;
}
}
当然,您可以使用lambdas和std::for_each
std::for_each(string.begin(), string.end(),
[&result](QChar c)
{
if (is_good(c)) {result += c; }
}
);
但它不是CCD_ 6惯用语。
请注意,从字符串中删除符号的速度较慢,然后添加新符号(如果保留了空间),这就是第一个代码示例速度较快的原因。