Boost logo

Boost Users :

Subject: Re: [Boost-users] [regex] Context-sensitive replacement of text using regex_replace
From: Eric Niebler (eric_at_[hidden])
Date: 2009-02-24 19:20:12


KEN RODE wrote:
> I've been struggling with a problem with using regex_replace this
> afternoon, and I would appreciate some pointers on properly using the
> regex package.
>
> I've got a file that is similar to a CSS style sheet (it's actually a Qt
> style sheet) that contains color entries that similar to: rgb( 200, 255,
> 200 ). I've already successfully written some code that finds these
> patterns and replaced them with statically determined text, just to
> verify that I was able to locate them all properly.
>
> I have an application in which the color scheme of the user interface
> (specified in the style sheet) has to change between a daytime and
> nighttime color scheme. The nighttime color scheme is derived from the
> daytime color scheme by reducing the luminance of the colors. I'd like
> to generate the nighttime color scheme from the daytime scheme by
> extracting the components of the color and applying a calculation to
> them, then replacing the original text with the new text.
>
> The examples on the Boost site for regex_replace all demonstrate
> replacement with static text. I suspect that I have to do some sort of
> combination using regex_replace, regex_iterator, and match_results, but
> I can't quite wrap my head around the documentation for these classes to
> see how they interoperate. I would appreciate some pointers as to how to
> proceed.

This sort of this is much more easily accomplished with Boost.Xpressive,
which permits little lambda-like substitution expressions. Here is a
little program to get you started. It computes a new sub substitution
string by subtracting each rgb value from 300.

#include <string>
#include <iostream>
#include <boost/xpressive/xpressive_static.hpp>
#include <boost/xpressive/regex_actions.hpp>
using namespace boost::xpressive;

int main()
{
   sregex rgb =
     "rgb( " >> (s1= +_d) >> ", " >> (s2= +_d) >> ", " >> (s3= +_d) >> " )";

   std::string str("This has rgb( 50, 150, 250 ) some color!");

   str = regex_replace(
       str
     , rgb
     , "rgb( "
         + as<std::string>(300 - as<int>(s1)) + ", "
         + as<std::string>(300 - as<int>(s2)) + ", "
         + as<std::string>(300 - as<int>(s3)) + " )"
   );

   std::cout << str << std::endl;
}

The above program displays:

   This has rgb( 250, 150, 50 ) some color!

HTH,

-- 
Eric Niebler
BoostPro Computing
http://www.boostpro.com

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net