Аналог php:preg_replace/e в boost::regex

Тема в разделе "LANGS.C", создана пользователем _DEN_, 12 окт 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Есть ли какой-то легкий способ делать замену неким callback-ом? Курение boost::regex_replace результатов не дало :-(
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Оказалось не сложно, но все же велосипед. Интересно, есть ли в бусте готовое решение.
    Код (Text):
    1. std::string replacer(boost::smatch const& m)
    2. {
    3.     return /* Собираем замену */;
    4. }
    5.  
    6. template <class char_type, class callback>
    7. std::basic_string<char_type> regex_replace_callback
    8. (
    9.     std::basic_string<char_type> const& content,
    10.     boost::basic_regex<char_type> const& regex,
    11.     callback cb,
    12.     boost::match_flag_type flags
    13. )
    14. {
    15.     typedef std::basic_string<char_type> string;
    16.     typedef typename string::iterator iterator;
    17.     typedef typename string::const_iterator const_iterator;
    18.     typedef boost::match_results<const_iterator> match;
    19.  
    20.     string result;
    21.     const_iterator it = content.begin();
    22.  
    23.     do
    24.     {
    25.         match m;
    26.         if(boost::regex_search(it, content.end(), m, regex, flags))
    27.         {
    28.             result.insert(result.end(), it, m[0].first);
    29.             result += cb(m);
    30.             it = m[0].second;
    31.         }
    32.         else
    33.         {
    34.             result.insert(result.end(), it, content.end());
    35.             it = content.end();
    36.         }
    37.     }
    38.     while(it != content.end());
    39.  
    40.     return result;
    41. }
    42.  
    43. int main(int argc, char** argv)
    44. {
    45.     std::string content = "Текст для обработки";
    46.     boost::regex expr("Регулярное выражение");
    47.  
    48.     std::cout << regex_replace_callback(content, expr, &replacer, boost::match_extra | boost::format_all);
    49.  
    50.     return 0;
    51. }
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    буст не панацея ;)
    Многих вещей там нет, да и баги регулярно всплывают.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name
    Лучше буста еще ничего не придумали.

    Слишком громкое заявление. Regex вылизан и не менялся уже хрен знает сколько.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    И вообще - попячся. Regex уже часть языка - он мигрировал в C++0x.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Я не про Regex, я его не юзал, не знаю. В других частях буста встречал.
    Ну да, как сборник различных либ он самый крутой, кто ж спорит.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    Ну просто ты сказал что
    . Я в общем-то и не предлагал падать на колени и молиться ему :derisive: Факт в том, что это лучшее, из того что есть.


    По теме - вроде бы такого способа нету, так что велосипеды, велосипеды :)
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а PCRE не смотрел?
    Там вроде неплохой враппер плюсовый есть.
     
  9. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    врапер не плохой, да токо гемора с ним немеряно)