Замена элементов в QString на основе предиката - PullRequest
2 голосов
/ 22 февраля 2012

Мне нужно заменить символы в QString на основе их QChar::category.В терминах stdlib я хочу

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

В качестве альтернативы, я доволен регулярным выражением, которое работает с категориями символов Unicode, которые я могу использовать для QString::replace.

Возможно ли это с QStringили мне действительно нужно превратить строку в std::vector<QChar> и обратно?

Редактировать: категории, которые я хочу сохранить :

  • для первогосимвол: $, _ или любой символ в категориях Unicode «Прописная буква (Lu)», «Строчная буква (Ll)», «Буква заглавного буквы (Lt)», «Буква модификатора (Lm)», «Другая буква (Lo) »Или« Буквенное число (Nl) »
  • для остальных: первый маркер плюс любые не присоединяющиеся символы нулевой ширины U + 200C, присоединяемые символы нулевой ширины U + 200D и символы в категориях Unicode«Метка без пробелов (Mn)», «Метка объединения интервалов (Mc)», «Десятичное число (Nd)» или «Знаки препинания (Pc)».

Я могу сделать первым/ отдых в несколько проходов.

1 Ответ

4 голосов
/ 22 февраля 2012

Qt предоставляет свои собственные способы делать такие вещи.Хорошо это или нет, но сомнительно, но Qt idiomatic будет

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

Конечно, вы можете сделать это с лямбдами и std::for_each

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

, но это не такQt idiomatic.

Обратите внимание, что удаление символов из строки выполняется медленнее, а затем добавление новых, если место зарезервировано, поэтому первый пример кода выполняется быстро.

...