Ersetzen von Elementen in einem QString basierend auf einem Prädikat
Frage
Ich muss Zeichen in einem QString
basierend auf ihren ersetzen
QChar::category
. In stdlib-Begriffen möchte ich
string.erase(std::remove_if(begin(string), end(string),
[](QChar c) {
QChar::Category cat = c.category();
return cat == .... || cat == ...; }),
string.end());
Alternativ bin ich mit einem regulären Ausdruck zufrieden, der mit Unicode-Zeichen funktioniert
Kategorien, die ich für QString::replace
verwenden kann.
Ist das mit QString möglich oder muss ich den String wirklich drehen?
in einem std::vector<QChar>
und zurück?
Bearbeiten: Die Kategorien, die ich behalten möchte :
- für das erste Zeichen: $, _ oder ein beliebiges Zeichen in den Unicode-Kategorien "Großbuchstaben (Lu)", "Kleinbuchstaben (Ll)", "Titelbuchstaben (Lt)", "Modifikatorbuchstabe (Lm)" , "Anderer Buchstabe (Lo)" oder "Buchstabennummer (Nl)"
- für den Rest: das erste Aufzählungszeichen plus alle Nicht-Joiner-Zeichen mit U + 200C-Nullbreite, Joiner-Zeichen mit U + 200D-Nullbreite und Zeichen in den Unicode-Kategorien „Nicht-Abstandsmarkierung (Mn)“, „Abstands-Kombinationsmarke (Mc) “,„ Dezimalstellennummer (Nd) “oder„ Connector-Interpunktion (Pc) “.
Ich kann in mehreren Durchgängen zuerst / ausruhen.
Lösung
Qt bietet seine eigenen Möglichkeiten, solche Dinge zu tun.Ob es gut ist oder nicht, ist zweifelhaft, aber Qt idiomatisch wäre
QString result;
result.reserve(string.size());
foreach (const QChar& c, string) {
if (is_good(c)) {
result += c;
}
}
Natürlich können Sie dies mit Lambdas und std::for_each
tun
std::for_each(string.begin(), string.end(),
[&result](QChar c)
{
if (is_good(c)) {result += c; }
}
);
aber es ist kein idacomatischer Qt
.
Beachten Sie, dass das Entfernen von Symbolen aus einer Zeichenfolge langsamer ist und das Hinzufügen neuer Symbole, wenn Speicherplatz reserviert wurde, aus diesem Grund das erste Codebeispiel schnell ist.