Substituindo elementos em um QString baseado em um predicado
Pergunta
Preciso substituir caracteres em um QString
com base em seusQChar::category
.Em termos de stdlib eu quero
string.erase(std::remove_if(begin(string), end(string),
[](QChar c) {
QChar::Category cat = c.category();
return cat == .... || cat == ...; }),
string.end());
Como alternativa, estou feliz com um regexp que funciona em caracteres unicode
categorias que eu posso usar para QString::replace
.
Isso é possível com o QString ou eu realmente preciso girar a corda
em um std::vector<QChar>
e volta?
Editar:As categorias que quero manter:
- para o primeiro personagem:$, _ ou qualquer caractere nas categorias Unicode “Letra maiúscula (Lu)”, “Letra minúscula (Ll)”, “Letra maiúscula (Lt)”, “Letra modificadora (Lm)”, “Outra letra (Lo)” ou “Número da letra (Nl)”
- para o resto:o primeiro marcador mais quaisquer caracteres não-juntores de largura zero U+200C, caracteres de junção de largura zero U+200D e caracteres nas categorias Unicode “Marca sem espaçamento (Mn)”, “Marca de combinação de espaçamento (Mc)”, “Decimal número do dígito (Nd)” ou “Pontuação do conector (Pc)”.
Posso fazer primeiro/descanso em múltiplas passagens.
Solução
O Qt fornece suas próprias maneiras de fazer essas coisas.Se é bom ou não, é duvidoso, mas o Qt idiomático seria
QString result;
result.reserve(string.size());
foreach (const QChar& c, string) {
if (is_good(c)) {
result += c;
}
}
Claro, você pode fazer isso com lambdas e std::for_each
std::for_each(string.begin(), string.end(),
[&result](QChar c)
{
if (is_good(c)) {result += c; }
}
);
mas não é Qt
idiomático.
Observe que remover símbolos de uma string é mais lento e, em seguida, adicionar novos, se o espaço for reservado, é por isso que o primeiro exemplo de código é rápido.