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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top