Как удалить не алфавитно-цифровые символы из одномерной последовательности в C Builder?

#c builder #unicode-string

Вопрос:

В проекте, над которым я работаю, используя Embarcadero C Builder, все исходные файлы используются UnicodeString при использовании строк.

Я нашел этот фрагмент для удаления символов из std::wstring :

 #include <cctype>
#include <algorithm>
#include <string>

//...

std::wstring FileHandler::removePunctuation(std::wstring word) 
{
    word.erase(std::remove_if(word.begin(), word.end(), 
                  [](char ch){ return !::iswalnum(ch); }), word.end());
    return word;
}
 

Но как мне применить тот же алгоритм к UnicodeString ? Или, есть ли аналогичная функция с реализацией?

Ответ №1:

UnicodeString имеет begin() и end() итераторы, поэтому вы можете использовать std::remove_if() точно так же, как и с std::wstring .

Однако UnicodeString у него нет erase() метода на основе итератора, как std::wstring у него, но у него есть Delete() метод на основе индекса. std::removee_if() просто переместите «удаленные» символы в конец строки, чтобы вы могли использовать remove_if() возвращаемый итератор для вычисления начального индекса для удаления, например:

 #include <cctype>
#include <algorithm>

//...

UnicodeString FileHandler::removePunctuation(UnicodeString word) 
{
    auto iter = std::remove_if(word.begin(), word.end(), 
                  [](WideChar ch){ return !::iswalnum(ch); });
    // Note: UnicodeString indexes start at 1, not 0!!
    word.Delete(std::distance(word.begin(), iter)   1, MaxInt);
    return word;
}