crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Простейший парсинг текста
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Tonal Дата 11.9.2008, 10:01
 
Цитата(AD @ 10.9.2008, 19:59) *
QString section ( QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const 
QString simplified () const
QStringList split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
QString trimmed () const

То, что подобного нет в stl-е это несколько огорчает.
Хотя, если вспомнить, что классов строк в stl-е как минимум 2, контейнеров и того больше, и опции не все однозначны, то становится понятно, почему так.

Ну а частные случаи реализуются довольно примитивно, например:
std::string trimmed(const std::string& in) {
  return std::string(in.find_first_not_of(" \t\r\n\v\f"), in.find_last_not_of(" \t\r\n\v\f"));
}
struct simplified_pred_t {
  simplified_pred_t(bool& is_prev_char) : is_prev_char(is_prev_char) {}
  bool operator()(const char c) {
    if (spase.find(c) == space.npos)
      return is_prev_char = false;
    if (is_prev_char)
      return true;
    is_prev_char = true;
    return false;
  }
  static const spase(" \t\r\n\v\f");
  private:
    bool& is_prev_char;
};
std::string simplified(const std::string& in) {
  std::string res;
  bool is_space = false;
  std::remove_copy_if(
    in.find_first_not_of(simplified_pred_t::space), in.find_last_not_of(simplified_pred_t::space),
    back_inserter(res), simplified_pred_t(is_space))
  return res;
}

Ну и есть есть Boost.algoritm - там многие такие примитивы живут. :)

Цитата(AD @ 10.9.2008, 19:59) *
int find(QRegExp* rx);

...Особенно интересно такие функции: как поиск по регэкспу (есть ли в stl регэкспы)...

Сейчас можно взять любую понравившуюся библиотеку регэкспов, например pcre или из боста (2 штуки).
В новый стандарт регэкспы будут включены (Вроде прототип - Boost.Regex).
molchanoviv Дата 10.9.2008, 16:24
  Я как раз занимаюсь классом виджетов для Free_DevStudio++ там необходимо парсить теги Ctags
Andrew Selivanov Дата 10.9.2008, 16:23
  если коротко то нет, за регэкспами смотри boost
AD Дата 10.9.2008, 15:59
  заметил такую вещь: в Qt-щном QString есть много дополнительных функций, которых нет в stl, но которые значительно упрощают простейший парсинг текста
QString section ( QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const 
QString simplified () const
QStringList split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
QString trimmed () const

// AND
int find(QRegExp* rx);

Есть ли хоть какая-нибудь замена подобным функциям в stl? Особенно интересно такие функции: как поиск по регэкспу (есть ли в stl регэкспы), удаление ненужных пробелов (simplified()), поиск куска текста по секциям (section())???
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 2:30