Domanda

Devo sostituire i caratteri in un QString basato sul loro QChar::category. In termini stdlib voglio

string.erase(std::remove_if(begin(string), end(string), 
                            [](QChar c) { 
                            QChar::Category cat = c.category(); 
                            return cat == .... || cat == ...; }), 
             string.end());

In alternativa, sono contento di una regexp che funziona sul carattere Unicode categorie che posso utilizzare per QString::replace.

È possibile con QString o devo davvero girare la stringa in un std::vector<QChar> e viceversa?

Modifica: le categorie che voglio mantenere :

  • per il primo carattere: $, _ o qualsiasi carattere nelle categorie Unicode "Lettera maiuscola (Lu)", "Lettera minuscola (Ll)", "Lettera minuscola (Lt)", "Lettera di modifica (Lm)" , "Altra lettera (Lo)" o "Numero lettera (Nl)"
  • per il resto: il primo punto più qualsiasi carattere non di unione di larghezza zero U + 200C, caratteri di unione di larghezza zero U + 200D e caratteri nelle categorie Unicode "Segno di non spaziatura (Mn)", "Segno di combinazione di spaziatura (Mc) "," Numero di cifre decimali (Nd) "o" Punteggiatura connettore (Pc) ".

Posso fare primo / riposo in più passaggi.

È stato utile?

Soluzione

Qt fornisce i propri modi per fare queste cose.Che sia buono o meno è dubbio, ma Qt idiomatico sarebbe

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

Ovviamente puoi farlo con lambda e std::for_each

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

ma non è idiomatico Qt.

Nota che la rimozione di simboli da una stringa è più lenta, quindi l'aggiunta di nuovi, se lo spazio era riservato, ecco perché il primo esempio di codice è veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top