crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Простейший парсинг текста, без помощи Qt
AD
  опции профиля:
сообщение 10.9.2008, 15:59
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


заметил такую вещь: в 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())???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 10.9.2008, 16:23
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


если коротко то нет, за регэкспами смотри boost
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 10.9.2008, 16:24
Сообщение #3


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Я как раз занимаюсь классом виджетов для Free_DevStudio++ там необходимо парсить теги Ctags
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 11.9.2008, 10:01
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(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).

Сообщение отредактировал Tonal - 11.9.2008, 10:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 18:20