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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top