Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2008-03-14 13:42:57

Robert Dailey wrote:
> An example of a string that I'll be searching is below:
> "This string $(variable1) has localized $(var2) text interleaved for no
> $(reason)"
> In the string above, we have 3 variables. Each variable will reference a
> string in a localization table, which will then be used to replace the
> variable itself.

It's not be hard to build such a thing using using regex_iterator.
Here's some code to get you going...

#include <map>
#include <iostream>
#include <boost/xpressive/xpressive.hpp>
using namespace boost;

template<typename OutIter, typename OtherBidiIter, typename BidiIter,
typename Format>
inline OutIter regex_grep(
     OutIter out
   , OtherBidiIter begin_
   , OtherBidiIter end_
   , xpressive::basic_regex<BidiIter> const &re
   , Format format
   , xpressive::regex_constants::match_flag_type flags =
     BidiIter begin = begin_, end = end_;
     xpressive::regex_iterator<BidiIter> it1(begin, end, re, flags), it2;
     bool yes_copy = !(flags & xpressive::regex_constants::format_no_copy);

     for(; it1 != it2; ++it1)
             out = std::copy(begin, (*it1)[0].first, out);
         out = format(*it1, out);
         begin = (*it1)[0].second;

         out = std::copy(begin, end, out);
     return out;

std::map<std::string, std::string> replacements;

struct format
     template<typename BidiIter, typename OutIter>
     OutIter operator()(xpressive::match_results<BidiIter> const &what,
OutIter out) const
         std::map<std::string, std::string>::const_iterator where =
         if(where != replacements.end())
             out = std::copy((*where).second.begin(),
(*where).second.end(), out);
         return out;

int main()
     replacements["X"] = "this";
     replacements["Y"] = "that";

     std::string input("\"$(X)\" has the value \"$(Y)\""), output;
     xpressive::sregex rx =

     regex_grep(std::back_inserter(output), input.begin(), input.end(),
rx, format());

     std::cout << output << std::endl;
     return 0;


Eric Niebler
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at