2012-02-22 1 views
2

Мне нужно заменить символы в QString на основе их QChar::category. В STDLIB плане я хочуЗамена элементов в QString на основе предиката

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

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

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

Edit: Категории я хочу держать:

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

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

+0

Какие категории вы хотите удалить? – sgibb

+0

@sgibb Те, которые не являются действительными идентификаторами JavaScript. Я добавлю их на этот пост. – pmr

ответ

4

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

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 идиоматическое.

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

+0

В равной степени хорошо. Благодарю. Обычно я предпочитаю операции на месте, так как они намного более чистые, чем коды, вместо того, чтобы бросать их во временные ряды и переназначать их оригиналу, но здесь это не имеет никакого значения. – pmr

 Смежные вопросы

  • Нет связанных вопросов^_^