|
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