Sostituzione di elementi in una QString basata su un predicato
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.
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.