• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<title>User's Guide</title>
6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9<link rel="up" href="../xpressive.html" title="Chapter 46. Boost.Xpressive">
10<link rel="prev" href="../xpressive.html" title="Chapter 46. Boost.Xpressive">
11<link rel="next" href="reference.html" title="Reference">
12</head>
13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14<table cellpadding="2" width="100%"><tr>
15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16<td align="center"><a href="../../../index.html">Home</a></td>
17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20<td align="center"><a href="../../../more/index.htm">More</a></td>
21</tr></table>
22<hr>
23<div class="spirit-nav">
24<a accesskey="p" href="../xpressive.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../xpressive.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
25</div>
26<div class="section">
27<div class="titlepage"><div><div><h2 class="title" style="clear: both">
28<a name="xpressive.user_s_guide"></a><a class="link" href="user_s_guide.html" title="User's Guide">User's Guide</a>
29</h2></div></div></div>
30<div class="toc"><dl class="toc">
31<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.introduction">Introduction</a></span></dt>
32<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.installing_xpressive">Installing
33      xpressive</a></span></dt>
34<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.quick_start">Quick Start</a></span></dt>
35<dt><span class="section"><a href="user_s_guide.html#xpressive.user_s_guide.creating_a_regex_object">Creating
36      a Regex Object</a></span></dt>
37<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.matching_and_searching">Matching
38      and Searching</a></span></dt>
39<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.accessing_results">Accessing
40      Results</a></span></dt>
41<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions">String
42      Substitutions</a></span></dt>
43<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.string_splitting_and_tokenization">String
44      Splitting and Tokenization</a></span></dt>
45<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.named_captures">Named Captures</a></span></dt>
46<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches">Grammars
47      and Nested Matches</a></span></dt>
48<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions">Semantic
49      Actions and User-Defined Assertions</a></span></dt>
50<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.symbol_tables_and_attributes">Symbol
51      Tables and Attributes</a></span></dt>
52<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits">Localization
53      and Regex Traits</a></span></dt>
54<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks">Tips 'N Tricks</a></span></dt>
55<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.concepts">Concepts</a></span></dt>
56<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.examples">Examples</a></span></dt>
57</dl></div>
58<p>
59      This section describes how to use xpressive to accomplish text manipulation
60      and parsing tasks. If you are looking for detailed information regarding specific
61      components in xpressive, check the <a class="link" href="reference.html" title="Reference">Reference</a>
62      section.
63    </p>
64<div class="section">
65<div class="titlepage"><div><div><h3 class="title">
66<a name="boost_xpressive.user_s_guide.introduction"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.introduction" title="Introduction">Introduction</a>
67</h3></div></div></div>
68<h3>
69<a name="boost_xpressive.user_s_guide.introduction.h0"></a>
70        <span class="phrase"><a name="boost_xpressive.user_s_guide.introduction.what_is_xpressive_"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.introduction.what_is_xpressive_">What
71        is xpressive?</a>
72      </h3>
73<p>
74        xpressive is a regular expression template library. Regular expressions (regexes)
75        can be written as strings that are parsed dynamically at runtime (dynamic
76        regexes), or as <span class="emphasis"><em>expression templates</em></span><a href="#ftn.boost_xpressive.user_s_guide.introduction.f0" class="footnote" name="boost_xpressive.user_s_guide.introduction.f0"><sup class="footnote">[36]</sup></a> that are parsed at compile-time (static regexes). Dynamic regexes
77        have the advantage that they can be accepted from the user as input at runtime
78        or read from an initialization file. Static regexes have several advantages.
79        Since they are C++ expressions instead of strings, they can be syntax-checked
80        at compile-time. Also, they can naturally refer to code and data elsewhere
81        in your program, giving you the ability to call back into your code from
82        within a regex match. Finally, since they are statically bound, the compiler
83        can generate faster code for static regexes.
84      </p>
85<p>
86        xpressive's dual nature is unique and powerful. Static xpressive is a bit
87        like the <a href="http://spirit.sourceforge.net" target="_top">Spirit Parser Framework</a>.
88        Like <a href="http://spirit.sourceforge.net" target="_top">Spirit</a>, you can build
89        grammars with static regexes using expression templates. (Unlike <a href="http://spirit.sourceforge.net" target="_top">Spirit</a>,
90        xpressive does exhaustive backtracking, trying every possibility to find
91        a match for your pattern.) Dynamic xpressive is a bit like <a href="../../../libs/regex" target="_top">Boost.Regex</a>.
92        In fact, xpressive's interface should be familiar to anyone who has used
93        <a href="../../../libs/regex" target="_top">Boost.Regex</a>. xpressive's innovation
94        comes from allowing you to mix and match static and dynamic regexes in the
95        same program, and even in the same expression! You can embed a dynamic regex
96        in a static regex, or <span class="emphasis"><em>vice versa</em></span>, and the embedded regex
97        will participate fully in the search, back-tracking as needed to make the
98        match succeed.
99      </p>
100<h3>
101<a name="boost_xpressive.user_s_guide.introduction.h1"></a>
102        <span class="phrase"><a name="boost_xpressive.user_s_guide.introduction.hello__world_"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.introduction.hello__world_">Hello,
103        world!</a>
104      </h3>
105<p>
106        Enough theory. Let's have a look at <span class="emphasis"><em>Hello World</em></span>, xpressive
107        style:
108      </p>
109<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
110<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
111
112<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
113
114<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
115<span class="special">{</span>
116    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">hello</span><span class="special">(</span> <span class="string">"hello world!"</span> <span class="special">);</span>
117
118    <span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"(\\w+) (\\w+)!"</span> <span class="special">);</span>
119    <span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
120
121    <span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="identifier">hello</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">rex</span> <span class="special">)</span> <span class="special">)</span>
122    <span class="special">{</span>
123        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// whole match</span>
124        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// first capture</span>
125        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// second capture</span>
126    <span class="special">}</span>
127
128    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
129<span class="special">}</span>
130</pre>
131<p>
132        This program outputs the following:
133      </p>
134<pre class="programlisting">hello world!
135hello
136world
137</pre>
138<p>
139        The first thing you'll notice about the code is that all the types in xpressive
140        live in the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span></code> namespace.
141      </p>
142<div class="note"><table border="0" summary="Note">
143<tr>
144<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
145<th align="left">Note</th>
146</tr>
147<tr><td align="left" valign="top"><p>
148          Most of the rest of the examples in this document will leave off the <code class="computeroutput"><span class="keyword">using</span> <span class="keyword">namespace</span>
149          <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span></code>
150          directive. Just pretend it's there.
151        </p></td></tr>
152</table></div>
153<p>
154        Next, you'll notice the type of the regular expression object is <code class="computeroutput"><span class="identifier">sregex</span></code>. If you are familiar with <a href="../../../libs/regex" target="_top">Boost.Regex</a>, this is different than what you
155        are used to. The "<code class="computeroutput"><span class="identifier">s</span></code>"
156        in "<code class="computeroutput"><span class="identifier">sregex</span></code>" stands
157        for "<code class="computeroutput"><span class="identifier">string</span></code>", indicating
158        that this regex can be used to find patterns in <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
159        objects. I'll discuss this difference and its implications in detail later.
160      </p>
161<p>
162        Notice how the regex object is initialized:
163      </p>
164<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"(\\w+) (\\w+)!"</span> <span class="special">);</span>
165</pre>
166<p>
167        To create a regular expression object from a string, you must call a factory
168        method such as <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html#id-1_3_47_5_18_2_1_1_9_1-bb">basic_regex&lt;&gt;::compile()</a></code></code>.
169        This is another area in which xpressive differs from other object-oriented
170        regular expression libraries. Other libraries encourage you to think of a
171        regular expression as a kind of string on steroids. In xpressive, regular
172        expressions are not strings; they are little programs in a domain-specific
173        language. Strings are only one <span class="emphasis"><em>representation</em></span> of that
174        language. Another representation is an expression template. For example,
175        the above line of code is equivalent to the following:
176      </p>
177<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">s1</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">' '</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s2</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span><span class="special">;</span>
178</pre>
179<p>
180        This describes the same regular expression, except it uses the domain-specific
181        embedded language defined by static xpressive.
182      </p>
183<p>
184        As you can see, static regexes have a syntax that is noticeably different
185        than standard Perl syntax. That is because we are constrained by C++'s syntax.
186        The biggest difference is the use of <code class="computeroutput"><span class="special">&gt;&gt;</span></code>
187        to mean "followed by". For instance, in Perl you can just put sub-expressions
188        next to each other:
189      </p>
190<pre class="programlisting"><span class="identifier">abc</span>
191</pre>
192<p>
193        But in C++, there must be an operator separating sub-expressions:
194      </p>
195<pre class="programlisting"><span class="identifier">a</span> <span class="special">&gt;&gt;</span> <span class="identifier">b</span> <span class="special">&gt;&gt;</span> <span class="identifier">c</span>
196</pre>
197<p>
198        In Perl, parentheses <code class="computeroutput"><span class="special">()</span></code> have
199        special meaning. They group, but as a side-effect they also create back-references
200        like <code class="literal">$1</code> and <code class="literal">$2</code>. In C++, there is no
201        way to overload parentheses to give them side-effects. To get the same effect,
202        we use the special <code class="computeroutput"><span class="identifier">s1</span></code>, <code class="computeroutput"><span class="identifier">s2</span></code>, etc. tokens. Assign to one to create
203        a back-reference (known as a sub-match in xpressive).
204      </p>
205<p>
206        You'll also notice that the one-or-more repetition operator <code class="computeroutput"><span class="special">+</span></code> has moved from postfix to prefix position.
207        That's because C++ doesn't have a postfix <code class="computeroutput"><span class="special">+</span></code>
208        operator. So:
209      </p>
210<pre class="programlisting"><span class="string">"\\w+"</span>
211</pre>
212<p>
213        is the same as:
214      </p>
215<pre class="programlisting"><span class="special">+</span><span class="identifier">_w</span>
216</pre>
217<p>
218        We'll cover all the other differences <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes" title="Static Regexes">later</a>.
219      </p>
220</div>
221<div class="section">
222<div class="titlepage"><div><div><h3 class="title">
223<a name="boost_xpressive.user_s_guide.installing_xpressive"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.installing_xpressive" title="Installing xpressive">Installing
224      xpressive</a>
225</h3></div></div></div>
226<h3>
227<a name="boost_xpressive.user_s_guide.installing_xpressive.h0"></a>
228        <span class="phrase"><a name="boost_xpressive.user_s_guide.installing_xpressive.getting_xpressive"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.installing_xpressive.getting_xpressive">Getting
229        xpressive</a>
230      </h3>
231<p>
232        There are two ways to get xpressive. The first and simplest is to download
233        the latest version of Boost. Just go to <a href="http://sf.net/projects/boost" target="_top">http://sf.net/projects/boost</a>
234        and follow the <span class="quote">“<span class="quote">Download</span>”</span> link.
235      </p>
236<p>
237        The second way is by directly accessing the Boost Subversion repository.
238        Just go to <a href="http://svn.boost.org/trac/boost/" target="_top">http://svn.boost.org/trac/boost/</a>
239        and follow the instructions there for anonymous Subversion access. The version
240        in Boost Subversion is unstable.
241      </p>
242<h3>
243<a name="boost_xpressive.user_s_guide.installing_xpressive.h1"></a>
244        <span class="phrase"><a name="boost_xpressive.user_s_guide.installing_xpressive.building_with_xpressive"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.installing_xpressive.building_with_xpressive">Building
245        with xpressive</a>
246      </h3>
247<p>
248        Xpressive is a header-only template library, which means you don't need to
249        alter your build scripts or link to any separate lib file to use it. All
250        you need to do is <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
251        If you are only using static regexes, you can improve compile times by only
252        including <code class="computeroutput"><span class="identifier">xpressive_static</span><span class="special">.</span><span class="identifier">hpp</span></code>. Likewise,
253        you can include <code class="computeroutput"><span class="identifier">xpressive_dynamic</span><span class="special">.</span><span class="identifier">hpp</span></code> if
254        you only plan on using dynamic regexes.
255      </p>
256<p>
257        If you would also like to use semantic actions or custom assertions with
258        your static regexes, you will need to additionally include <code class="computeroutput"><span class="identifier">regex_actions</span><span class="special">.</span><span class="identifier">hpp</span></code>.
259      </p>
260<h3>
261<a name="boost_xpressive.user_s_guide.installing_xpressive.h2"></a>
262        <span class="phrase"><a name="boost_xpressive.user_s_guide.installing_xpressive.requirements"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.installing_xpressive.requirements">Requirements</a>
263      </h3>
264<p>
265        Xpressive requires Boost version 1.34.1 or higher.
266      </p>
267<h3>
268<a name="boost_xpressive.user_s_guide.installing_xpressive.h3"></a>
269        <span class="phrase"><a name="boost_xpressive.user_s_guide.installing_xpressive.supported_compilers"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.installing_xpressive.supported_compilers">Supported
270        Compilers</a>
271      </h3>
272<p>
273        Currently, Boost.Xpressive is known to work on the following compilers:
274      </p>
275<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
276<li class="listitem">
277            Visual C++ 7.1 and higher
278          </li>
279<li class="listitem">
280            GNU C++ 3.4 and higher
281          </li>
282<li class="listitem">
283            Intel for Linux 8.1 and higher
284          </li>
285<li class="listitem">
286            Intel for Windows 10 and higher
287          </li>
288<li class="listitem">
289            tru64cxx 71 and higher
290          </li>
291<li class="listitem">
292            MinGW 3.4 and higher
293          </li>
294<li class="listitem">
295            HP C/aC++ A.06.14
296          </li>
297</ul></div>
298<p>
299        Check the latest tests results at Boost's <a href="http://beta.boost.org/development/tests/trunk/developer/xpressive.html" target="_top">Regression
300        Results Page</a>.
301      </p>
302<div class="note"><table border="0" summary="Note">
303<tr>
304<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
305<th align="left">Note</th>
306</tr>
307<tr><td align="left" valign="top"><p>
308          Please send any questions, comments and bug reports to eric &lt;at&gt;
309          boost-consulting &lt;dot&gt; com.
310        </p></td></tr>
311</table></div>
312</div>
313<div class="section">
314<div class="titlepage"><div><div><h3 class="title">
315<a name="boost_xpressive.user_s_guide.quick_start"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.quick_start" title="Quick Start">Quick Start</a>
316</h3></div></div></div>
317<p>
318        You don't need to know much to start being productive with xpressive. Let's
319        begin with the nickel tour of the types and algorithms xpressive provides.
320      </p>
321<div class="table">
322<a name="boost_xpressive.user_s_guide.quick_start.t0"></a><p class="title"><b>Table 46.1. xpressive's Tool-Box</b></p>
323<div class="table-contents"><table class="table" summary="xpressive's Tool-Box">
324<colgroup>
325<col>
326<col>
327</colgroup>
328<thead><tr>
329<th>
330                <p>
331                  Tool
332                </p>
333              </th>
334<th>
335                <p>
336                  Description
337                </p>
338              </th>
339</tr></thead>
340<tbody>
341<tr>
342<td>
343                <p>
344                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
345                </p>
346              </td>
347<td>
348                <p>
349                  Contains a compiled regular expression. <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
350                  is the most important type in xpressive. Everything you do with
351                  xpressive will begin with creating an object of type <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>.
352                </p>
353              </td>
354</tr>
355<tr>
356<td>
357                <p>
358                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>,
359                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
360                </p>
361              </td>
362<td>
363                <p>
364                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
365                  contains the results of a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
366                  or <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
367                  operation. It acts like a vector of <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
368                  objects. A <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
369                  object contains a marked sub-expression (also known as a back-reference
370                  in Perl). It is basically just a pair of iterators representing
371                  the begin and end of the marked sub-expression.
372                </p>
373              </td>
374</tr>
375<tr>
376<td>
377                <p>
378                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
379                </p>
380              </td>
381<td>
382                <p>
383                  Checks to see if a string matches a regex. For <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
384                  to succeed, the <span class="emphasis"><em>whole string</em></span> must match the
385                  regex, from beginning to end. If you give <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
386                  a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>,
387                  it will write into it any marked sub-expressions it finds.
388                </p>
389              </td>
390</tr>
391<tr>
392<td>
393                <p>
394                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
395                </p>
396              </td>
397<td>
398                <p>
399                  Searches a string to find a sub-string that matches the regex.
400                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
401                  will try to find a match at every position in the string, starting
402                  at the beginning, and stopping when it finds a match or when the
403                  string is exhausted. As with <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>,
404                  if you give <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
405                  a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>,
406                  it will write into it any marked sub-expressions it finds.
407                </p>
408              </td>
409</tr>
410<tr>
411<td>
412                <p>
413                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
414                </p>
415              </td>
416<td>
417                <p>
418                  Given an input string, a regex, and a substitution string, <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
419                  builds a new string by replacing those parts of the input string
420                  that match the regex with the substitution string. The substitution
421                  string can contain references to marked sub-expressions.
422                </p>
423              </td>
424</tr>
425<tr>
426<td>
427                <p>
428                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_iterator.html" title="Struct template regex_iterator">regex_iterator&lt;&gt;</a></code></code>
429                </p>
430              </td>
431<td>
432                <p>
433                  An STL-compatible iterator that makes it easy to find all the places
434                  in a string that match a regex. Dereferencing a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_iterator.html" title="Struct template regex_iterator">regex_iterator&lt;&gt;</a></code></code>
435                  returns a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>.
436                  Incrementing a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_iterator.html" title="Struct template regex_iterator">regex_iterator&lt;&gt;</a></code></code>
437                  finds the next match.
438                </p>
439              </td>
440</tr>
441<tr>
442<td>
443                <p>
444                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
445                </p>
446              </td>
447<td>
448                <p>
449                  Like <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_iterator.html" title="Struct template regex_iterator">regex_iterator&lt;&gt;</a></code></code>,
450                  except dereferencing a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
451                  returns a string. By default, it will return the whole sub-string
452                  that the regex matched, but it can be configured to return any
453                  or all of the marked sub-expressions one at a time, or even the
454                  parts of the string that <span class="emphasis"><em>didn't</em></span> match the
455                  regex.
456                </p>
457              </td>
458</tr>
459<tr>
460<td>
461                <p>
462                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
463                </p>
464              </td>
465<td>
466                <p>
467                  A factory for <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
468                  objects. It "compiles" a string into a regular expression.
469                  You will not usually have to deal directly with <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
470                  because the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
471                  class has a factory method that uses <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
472                  internally. But if you need to do anything fancy like create a
473                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
474                  object with a different <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span></code>,
475                  you will need to use a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
476                  explicitly.
477                </p>
478              </td>
479</tr>
480</tbody>
481</table></div>
482</div>
483<br class="table-break"><p>
484        Now that you know a bit about the tools xpressive provides, you can pick
485        the right tool for you by answering the following two questions:
486      </p>
487<div class="orderedlist"><ol class="orderedlist" type="1">
488<li class="listitem">
489            What <span class="emphasis"><em>iterator</em></span> type will you use to traverse your
490            data?
491          </li>
492<li class="listitem">
493            What do you want to <span class="emphasis"><em>do</em></span> to your data?
494          </li>
495</ol></div>
496<h3>
497<a name="boost_xpressive.user_s_guide.quick_start.h0"></a>
498        <span class="phrase"><a name="boost_xpressive.user_s_guide.quick_start.know_your_iterator_type"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.quick_start.know_your_iterator_type">Know
499        Your Iterator Type</a>
500      </h3>
501<p>
502        Most of the classes in xpressive are templates that are parameterized on
503        the iterator type. xpressive defines some common typedefs to make the job
504        of choosing the right types easier. You can use the table below to find the
505        right types based on the type of your iterator.
506      </p>
507<div class="table">
508<a name="boost_xpressive.user_s_guide.quick_start.t1"></a><p class="title"><b>Table 46.2. xpressive Typedefs vs. Iterator Types</b></p>
509<div class="table-contents"><table class="table" summary="xpressive Typedefs vs. Iterator Types">
510<colgroup>
511<col>
512<col>
513<col>
514<col>
515<col>
516</colgroup>
517<thead><tr>
518<th>
519              </th>
520<th>
521                <p>
522                  std::string::const_iterator
523                </p>
524              </th>
525<th>
526                <p>
527                  char const *
528                </p>
529              </th>
530<th>
531                <p>
532                  std::wstring::const_iterator
533                </p>
534              </th>
535<th>
536                <p>
537                  wchar_t const *
538                </p>
539              </th>
540</tr></thead>
541<tbody>
542<tr>
543<td>
544                <p>
545                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
546                </p>
547              </td>
548<td>
549                <p>
550                  <code class="computeroutput"><span class="identifier">sregex</span></code>
551                </p>
552              </td>
553<td>
554                <p>
555                  <code class="computeroutput"><span class="identifier">cregex</span></code>
556                </p>
557              </td>
558<td>
559                <p>
560                  <code class="computeroutput"><span class="identifier">wsregex</span></code>
561                </p>
562              </td>
563<td>
564                <p>
565                  <code class="computeroutput"><span class="identifier">wcregex</span></code>
566                </p>
567              </td>
568</tr>
569<tr>
570<td>
571                <p>
572                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
573                </p>
574              </td>
575<td>
576                <p>
577                  <code class="computeroutput"><span class="identifier">smatch</span></code>
578                </p>
579              </td>
580<td>
581                <p>
582                  <code class="computeroutput"><span class="identifier">cmatch</span></code>
583                </p>
584              </td>
585<td>
586                <p>
587                  <code class="computeroutput"><span class="identifier">wsmatch</span></code>
588                </p>
589              </td>
590<td>
591                <p>
592                  <code class="computeroutput"><span class="identifier">wcmatch</span></code>
593                </p>
594              </td>
595</tr>
596<tr>
597<td>
598                <p>
599                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
600                </p>
601              </td>
602<td>
603                <p>
604                  <code class="computeroutput"><span class="identifier">sregex_compiler</span></code>
605                </p>
606              </td>
607<td>
608                <p>
609                  <code class="computeroutput"><span class="identifier">cregex_compiler</span></code>
610                </p>
611              </td>
612<td>
613                <p>
614                  <code class="computeroutput"><span class="identifier">wsregex_compiler</span></code>
615                </p>
616              </td>
617<td>
618                <p>
619                  <code class="computeroutput"><span class="identifier">wcregex_compiler</span></code>
620                </p>
621              </td>
622</tr>
623<tr>
624<td>
625                <p>
626                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_iterator.html" title="Struct template regex_iterator">regex_iterator&lt;&gt;</a></code></code>
627                </p>
628              </td>
629<td>
630                <p>
631                  <code class="computeroutput"><span class="identifier">sregex_iterator</span></code>
632                </p>
633              </td>
634<td>
635                <p>
636                  <code class="computeroutput"><span class="identifier">cregex_iterator</span></code>
637                </p>
638              </td>
639<td>
640                <p>
641                  <code class="computeroutput"><span class="identifier">wsregex_iterator</span></code>
642                </p>
643              </td>
644<td>
645                <p>
646                  <code class="computeroutput"><span class="identifier">wcregex_iterator</span></code>
647                </p>
648              </td>
649</tr>
650<tr>
651<td>
652                <p>
653                  <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
654                </p>
655              </td>
656<td>
657                <p>
658                  <code class="computeroutput"><span class="identifier">sregex_token_iterator</span></code>
659                </p>
660              </td>
661<td>
662                <p>
663                  <code class="computeroutput"><span class="identifier">cregex_token_iterator</span></code>
664                </p>
665              </td>
666<td>
667                <p>
668                  <code class="computeroutput"><span class="identifier">wsregex_token_iterator</span></code>
669                </p>
670              </td>
671<td>
672                <p>
673                  <code class="computeroutput"><span class="identifier">wcregex_token_iterator</span></code>
674                </p>
675              </td>
676</tr>
677</tbody>
678</table></div>
679</div>
680<br class="table-break"><p>
681        You should notice the systematic naming convention. Many of these types are
682        used together, so the naming convention helps you to use them consistently.
683        For instance, if you have a <code class="computeroutput"><span class="identifier">sregex</span></code>,
684        you should also be using a <code class="computeroutput"><span class="identifier">smatch</span></code>.
685      </p>
686<p>
687        If you are not using one of those four iterator types, then you can use the
688        templates directly and specify your iterator type.
689      </p>
690<h3>
691<a name="boost_xpressive.user_s_guide.quick_start.h1"></a>
692        <span class="phrase"><a name="boost_xpressive.user_s_guide.quick_start.know_your_task"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.quick_start.know_your_task">Know Your
693        Task</a>
694      </h3>
695<p>
696        Do you want to find a pattern once? Many times? Search and replace? xpressive
697        has tools for all that and more. Below is a quick reference:
698      </p>
699<div class="table">
700<a name="boost_xpressive.user_s_guide.quick_start.t2"></a><p class="title"><b>Table 46.3. Tasks and Tools</b></p>
701<div class="table-contents"><table class="table" summary="Tasks and Tools">
702<colgroup>
703<col>
704<col>
705</colgroup>
706<thead><tr>
707<th>
708                <p>
709                  To do this ...
710                </p>
711              </th>
712<th>
713                <p>
714                  Use this ...
715                </p>
716              </th>
717</tr></thead>
718<tbody>
719<tr>
720<td>
721                <p>
722                  <span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.see_if_a_whole_string_matches_a_regex">See
723                  if a whole string matches a regex</a>
724                </p>
725              </td>
726<td>
727                <p>
728                  The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
729                  algorithm
730                </p>
731              </td>
732</tr>
733<tr>
734<td>
735                <p>
736                  <span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.see_if_a_string_contains_a_sub_string_that_matches_a_regex">See
737                  if a string contains a sub-string that matches a regex</a>
738                </p>
739              </td>
740<td>
741                <p>
742                  The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
743                  algorithm
744                </p>
745              </td>
746</tr>
747<tr>
748<td>
749                <p>
750                  <span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.replace_all_sub_strings_that_match_a_regex">Replace
751                  all sub-strings that match a regex</a>
752                </p>
753              </td>
754<td>
755                <p>
756                  The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
757                  algorithm
758                </p>
759              </td>
760</tr>
761<tr>
762<td>
763                <p>
764                  <span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.find_all_the_sub_strings_that_match_a_regex_and_step_through_them_one_at_a_time">Find
765                  all the sub-strings that match a regex and step through them one
766                  at a time</a>
767                </p>
768              </td>
769<td>
770                <p>
771                  The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_iterator.html" title="Struct template regex_iterator">regex_iterator&lt;&gt;</a></code></code>
772                  class
773                </p>
774              </td>
775</tr>
776<tr>
777<td>
778                <p>
779                  <span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.split_a_string_into_tokens_that_each_match_a_regex">Split
780                  a string into tokens that each match a regex</a>
781                </p>
782              </td>
783<td>
784                <p>
785                  The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
786                  class
787                </p>
788              </td>
789</tr>
790<tr>
791<td>
792                <p>
793                  <span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.split_a_string_using_a_regex_as_a_delimiter">Split
794                  a string using a regex as a delimiter</a>
795                </p>
796              </td>
797<td>
798                <p>
799                  The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
800                  class
801                </p>
802              </td>
803</tr>
804</tbody>
805</table></div>
806</div>
807<br class="table-break"><p>
808        These algorithms and classes are described in excruciating detail in the
809        Reference section.
810      </p>
811<div class="tip"><table border="0" summary="Tip">
812<tr>
813<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../doc/src/images/tip.png"></td>
814<th align="left">Tip</th>
815</tr>
816<tr><td align="left" valign="top"><p>
817          Try clicking on a task in the table above to see a complete example program
818          that uses xpressive to solve that particular task.
819        </p></td></tr>
820</table></div>
821</div>
822<div class="section">
823<div class="titlepage"><div><div><h3 class="title">
824<a name="xpressive.user_s_guide.creating_a_regex_object"></a><a class="link" href="user_s_guide.html#xpressive.user_s_guide.creating_a_regex_object" title="Creating a Regex Object">Creating
825      a Regex Object</a>
826</h3></div></div></div>
827<div class="toc"><dl class="toc">
828<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes">Static
829        Regexes</a></span></dt>
830<dt><span class="section"><a href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes">Dynamic
831        Regexes</a></span></dt>
832</dl></div>
833<p>
834        When using xpressive, the first thing you'll do is create a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
835        object. This section goes over the nuts and bolts of building a regular expression
836        in the two dialects xpressive supports: static and dynamic.
837      </p>
838<div class="section">
839<div class="titlepage"><div><div><h4 class="title">
840<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes" title="Static Regexes">Static
841        Regexes</a>
842</h4></div></div></div>
843<h3>
844<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.h0"></a>
845          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.overview">Overview</a>
846        </h3>
847<p>
848          The feature that really sets xpressive apart from other C/C++ regular expression
849          libraries is the ability to author a regular expression using C++ expressions.
850          xpressive achieves this through operator overloading, using a technique
851          called <span class="emphasis"><em>expression templates</em></span> to embed a mini-language
852          dedicated to pattern matching within C++. These "static regexes"
853          have many advantages over their string-based brethren. In particular, static
854          regexes:
855        </p>
856<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
857<li class="listitem">
858              are syntax-checked at compile-time; they will never fail at run-time
859              due to a syntax error.
860            </li>
861<li class="listitem">
862              can naturally refer to other C++ data and code, including other regexes,
863              making it simple to build grammars out of regular expressions and bind
864              user-defined actions that execute when parts of your regex match.
865            </li>
866<li class="listitem">
867              are statically bound for better inlining and optimization. Static regexes
868              require no state tables, virtual functions, byte-code or calls through
869              function pointers that cannot be resolved at compile time.
870            </li>
871<li class="listitem">
872              are not limited to searching for patterns in strings. You can declare
873              a static regex that finds patterns in an array of integers, for instance.
874            </li>
875</ul></div>
876<p>
877          Since we compose static regexes using C++ expressions, we are constrained
878          by the rules for legal C++ expressions. Unfortunately, that means that
879          "classic" regular expression syntax cannot always be mapped cleanly
880          into C++. Rather, we map the regex <span class="emphasis"><em>constructs</em></span>, picking
881          new syntax that is legal C++.
882        </p>
883<h3>
884<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.h1"></a>
885          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.construction_and_assignment"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.construction_and_assignment">Construction
886          and Assignment</a>
887        </h3>
888<p>
889          You create a static regex by assigning one to an object of type <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>.
890          For instance, the following defines a regex that can be used to find patterns
891          in objects of type <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>:
892        </p>
893<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="char">'$'</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="char">'.'</span> <span class="special">&gt;&gt;</span> <span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="identifier">_d</span><span class="special">;</span>
894</pre>
895<p>
896          Assignment works similarly.
897        </p>
898<h3>
899<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.h2"></a>
900          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.character_and_string_literals"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.character_and_string_literals">Character
901          and String Literals</a>
902        </h3>
903<p>
904          In static regexes, character and string literals match themselves. For
905          instance, in the regex above, <code class="computeroutput"><span class="char">'$'</span></code>
906          and <code class="computeroutput"><span class="char">'.'</span></code> match the characters
907          <code class="computeroutput"><span class="char">'$'</span></code> and <code class="computeroutput"><span class="char">'.'</span></code>
908          respectively. Don't be confused by the fact that <code class="literal">$</code> and
909          <code class="literal">.</code> are meta-characters in Perl. In xpressive, literals
910          always represent themselves.
911        </p>
912<p>
913          When using literals in static regexes, you must take care that at least
914          one operand is not a literal. For instance, the following are <span class="emphasis"><em>not</em></span>
915          valid regexes:
916        </p>
917<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">re1</span> <span class="special">=</span> <span class="char">'a'</span> <span class="special">&gt;&gt;</span> <span class="char">'b'</span><span class="special">;</span>         <span class="comment">// ERROR!</span>
918<span class="identifier">sregex</span> <span class="identifier">re2</span> <span class="special">=</span> <span class="special">+</span><span class="char">'a'</span><span class="special">;</span>               <span class="comment">// ERROR!</span>
919</pre>
920<p>
921          The two operands to the binary <code class="computeroutput"><span class="special">&gt;&gt;</span></code>
922          operator are both literals, and the operand of the unary <code class="computeroutput"><span class="special">+</span></code> operator is also a literal, so these statements
923          will call the native C++ binary right-shift and unary plus operators, respectively.
924          That's not what we want. To get operator overloading to kick in, at least
925          one operand must be a user-defined type. We can use xpressive's <code class="computeroutput"><span class="identifier">as_xpr</span><span class="special">()</span></code>
926          helper function to "taint" an expression with regex-ness, forcing
927          operator overloading to find the correct operators. The two regexes above
928          should be written as:
929        </p>
930<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">re1</span> <span class="special">=</span> <span class="identifier">as_xpr</span><span class="special">(</span><span class="char">'a'</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">'b'</span><span class="special">;</span> <span class="comment">// OK</span>
931<span class="identifier">sregex</span> <span class="identifier">re2</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">as_xpr</span><span class="special">(</span><span class="char">'a'</span><span class="special">);</span>       <span class="comment">// OK</span>
932</pre>
933<h3>
934<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.h3"></a>
935          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.sequencing_and_alternation"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.sequencing_and_alternation">Sequencing
936          and Alternation</a>
937        </h3>
938<p>
939          As you've probably already noticed, sub-expressions in static regexes must
940          be separated by the sequencing operator, <code class="computeroutput"><span class="special">&gt;&gt;</span></code>.
941          You can read this operator as "followed by".
942        </p>
943<pre class="programlisting"><span class="comment">// Match an 'a' followed by a digit</span>
944<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="char">'a'</span> <span class="special">&gt;&gt;</span> <span class="identifier">_d</span><span class="special">;</span>
945</pre>
946<p>
947          Alternation works just as it does in Perl with the <code class="computeroutput"><span class="special">|</span></code>
948          operator. You can read this operator as "or". For example:
949        </p>
950<pre class="programlisting"><span class="comment">// match a digit character or a word character one or more times</span>
951<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">|</span> <span class="identifier">_w</span> <span class="special">);</span>
952</pre>
953<h3>
954<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.h4"></a>
955          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.grouping_and_captures"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.grouping_and_captures">Grouping
956          and Captures</a>
957        </h3>
958<p>
959          In Perl, parentheses <code class="computeroutput"><span class="special">()</span></code> have
960          special meaning. They group, but as a side-effect they also create back-references
961          like <code class="literal">$1</code> and <code class="literal">$2</code>. In C++, parentheses
962          only group -- there is no way to give them side-effects. To get the same
963          effect, we use the special <code class="computeroutput"><span class="identifier">s1</span></code>,
964          <code class="computeroutput"><span class="identifier">s2</span></code>, etc. tokens. Assigning
965          to one creates a back-reference. You can then use the back-reference later
966          in your expression, like using <code class="literal">\1</code> and <code class="literal">\2</code>
967          in Perl. For example, consider the following regex, which finds matching
968          HTML tags:
969        </p>
970<pre class="programlisting"><span class="string">"&lt;(\\w+)&gt;.*?&lt;/\\1&gt;"</span>
971</pre>
972<p>
973          In static xpressive, this would be:
974        </p>
975<pre class="programlisting"><span class="char">'&lt;'</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s1</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">'&gt;'</span> <span class="special">&gt;&gt;</span> <span class="special">-*</span><span class="identifier">_</span> <span class="special">&gt;&gt;</span> <span class="string">"&lt;/"</span> <span class="special">&gt;&gt;</span> <span class="identifier">s1</span> <span class="special">&gt;&gt;</span> <span class="char">'&gt;'</span>
976</pre>
977<p>
978          Notice how you capture a back-reference by assigning to <code class="computeroutput"><span class="identifier">s1</span></code>,
979          and then you use <code class="computeroutput"><span class="identifier">s1</span></code> later
980          in the pattern to find the matching end tag.
981        </p>
982<div class="tip"><table border="0" summary="Tip">
983<tr>
984<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../doc/src/images/tip.png"></td>
985<th align="left">Tip</th>
986</tr>
987<tr><td align="left" valign="top"><p>
988            <span class="bold"><strong>Grouping without capturing a back-reference</strong></span>
989            <br> <br> In xpressive, if you just want grouping without capturing
990            a back-reference, you can just use <code class="computeroutput"><span class="special">()</span></code>
991            without <code class="computeroutput"><span class="identifier">s1</span></code>. That is the
992            equivalent of Perl's <code class="literal">(?:)</code> non-capturing grouping construct.
993          </p></td></tr>
994</table></div>
995<h3>
996<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.h5"></a>
997          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.case_insensitivity_and_internationalization"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.case_insensitivity_and_internationalization">Case-Insensitivity
998          and Internationalization</a>
999        </h3>
1000<p>
1001          Perl lets you make part of your regular expression case-insensitive by
1002          using the <code class="literal">(?i:)</code> pattern modifier. xpressive also has
1003          a case-insensitivity pattern modifier, called <code class="computeroutput"><span class="identifier">icase</span></code>.
1004          You can use it as follows:
1005        </p>
1006<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="string">"this"</span> <span class="special">&gt;&gt;</span> <span class="identifier">icase</span><span class="special">(</span> <span class="string">"that"</span> <span class="special">);</span>
1007</pre>
1008<p>
1009          In this regular expression, <code class="computeroutput"><span class="string">"this"</span></code>
1010          will be matched exactly, but <code class="computeroutput"><span class="string">"that"</span></code>
1011          will be matched irrespective of case.
1012        </p>
1013<p>
1014          Case-insensitive regular expressions raise the issue of internationalization:
1015          how should case-insensitive character comparisons be evaluated? Also, many
1016          character classes are locale-specific. Which characters are matched by
1017          <code class="computeroutput"><span class="identifier">digit</span></code> and which are matched
1018          by <code class="computeroutput"><span class="identifier">alpha</span></code>? The answer depends
1019          on the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span></code> object the regular expression
1020          object is using. By default, all regular expression objects use the global
1021          locale. You can override the default by using the <code class="computeroutput"><span class="identifier">imbue</span><span class="special">()</span></code> pattern modifier, as follows:
1022        </p>
1023<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span> <span class="identifier">my_locale</span> <span class="special">=</span> <span class="comment">/* initialize a std::locale object */</span><span class="special">;</span>
1024<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">imbue</span><span class="special">(</span> <span class="identifier">my_locale</span> <span class="special">)(</span> <span class="special">+</span><span class="identifier">alpha</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">digit</span> <span class="special">);</span>
1025</pre>
1026<p>
1027          This regular expression will evaluate <code class="computeroutput"><span class="identifier">alpha</span></code>
1028          and <code class="computeroutput"><span class="identifier">digit</span></code> according to
1029          <code class="computeroutput"><span class="identifier">my_locale</span></code>. See the section
1030          on <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits" title="Localization and Regex Traits">Localization
1031          and Regex Traits</a> for more information about how to customize the
1032          behavior of your regexes.
1033        </p>
1034<h3>
1035<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.h6"></a>
1036          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.static_xpressive_syntax_cheat_sheet"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.static_xpressive_syntax_cheat_sheet">Static
1037          xpressive Syntax Cheat Sheet</a>
1038        </h3>
1039<p>
1040          The table below lists the familiar regex constructs and their equivalents
1041          in static xpressive.
1042        </p>
1043<div class="table">
1044<a name="boost_xpressive.user_s_guide.creating_a_regex_object.static_regexes.t0"></a><p class="title"><b>Table 46.4. Perl syntax vs. Static xpressive syntax</b></p>
1045<div class="table-contents"><table class="table" summary="Perl syntax vs. Static xpressive syntax">
1046<colgroup>
1047<col>
1048<col>
1049<col>
1050</colgroup>
1051<thead><tr>
1052<th>
1053                  <p>
1054                    Perl
1055                  </p>
1056                </th>
1057<th>
1058                  <p>
1059                    Static xpressive
1060                  </p>
1061                </th>
1062<th>
1063                  <p>
1064                    Meaning
1065                  </p>
1066                </th>
1067</tr></thead>
1068<tbody>
1069<tr>
1070<td>
1071                  <p>
1072                    <code class="literal">.</code>
1073                  </p>
1074                </td>
1075<td>
1076                  <p>
1077                    <code class="computeroutput"><a class="link" href="../boost/xpressive/_.html" title="Global _">_</a></code>
1078                  </p>
1079                </td>
1080<td>
1081                  <p>
1082                    any character (assuming Perl's /s modifier).
1083                  </p>
1084                </td>
1085</tr>
1086<tr>
1087<td>
1088                  <p>
1089                    <code class="literal">ab</code>
1090                  </p>
1091                </td>
1092<td>
1093                  <p>
1094                    <code class="computeroutput"><span class="identifier">a</span> <span class="special">&gt;&gt;</span>
1095                    <span class="identifier">b</span></code>
1096                  </p>
1097                </td>
1098<td>
1099                  <p>
1100                    sequencing of <code class="literal">a</code> and <code class="literal">b</code> sub-expressions.
1101                  </p>
1102                </td>
1103</tr>
1104<tr>
1105<td>
1106                  <p>
1107                    <code class="literal">a|b</code>
1108                  </p>
1109                </td>
1110<td>
1111                  <p>
1112                    <code class="computeroutput"><span class="identifier">a</span> <span class="special">|</span>
1113                    <span class="identifier">b</span></code>
1114                  </p>
1115                </td>
1116<td>
1117                  <p>
1118                    alternation of <code class="literal">a</code> and <code class="literal">b</code>
1119                    sub-expressions.
1120                  </p>
1121                </td>
1122</tr>
1123<tr>
1124<td>
1125                  <p>
1126                    <code class="literal">(a)</code>
1127                  </p>
1128                </td>
1129<td>
1130                  <p>
1131                    <code class="computeroutput"><span class="special">(</span><a class="link" href="../boost/xpressive/s1.html" title="Global s1">s1</a><span class="special">=</span> <span class="identifier">a</span><span class="special">)</span></code>
1132                  </p>
1133                </td>
1134<td>
1135                  <p>
1136                    group and capture a back-reference.
1137                  </p>
1138                </td>
1139</tr>
1140<tr>
1141<td>
1142                  <p>
1143                    <code class="literal">(?:a)</code>
1144                  </p>
1145                </td>
1146<td>
1147                  <p>
1148                    <code class="computeroutput"><span class="special">(</span><span class="identifier">a</span><span class="special">)</span></code>
1149                  </p>
1150                </td>
1151<td>
1152                  <p>
1153                    group and do not capture a back-reference.
1154                  </p>
1155                </td>
1156</tr>
1157<tr>
1158<td>
1159                  <p>
1160                    <code class="literal">\1</code>
1161                  </p>
1162                </td>
1163<td>
1164                  <p>
1165                    <code class="computeroutput"><a class="link" href="../boost/xpressive/s1.html" title="Global s1">s1</a></code>
1166                  </p>
1167                </td>
1168<td>
1169                  <p>
1170                    a previously captured back-reference.
1171                  </p>
1172                </td>
1173</tr>
1174<tr>
1175<td>
1176                  <p>
1177                    <code class="literal">a*</code>
1178                  </p>
1179                </td>
1180<td>
1181                  <p>
1182                    <code class="computeroutput"><span class="special">*</span><span class="identifier">a</span></code>
1183                  </p>
1184                </td>
1185<td>
1186                  <p>
1187                    zero or more times, greedy.
1188                  </p>
1189                </td>
1190</tr>
1191<tr>
1192<td>
1193                  <p>
1194                    <code class="literal">a+</code>
1195                  </p>
1196                </td>
1197<td>
1198                  <p>
1199                    <code class="computeroutput"><span class="special">+</span><span class="identifier">a</span></code>
1200                  </p>
1201                </td>
1202<td>
1203                  <p>
1204                    one or more times, greedy.
1205                  </p>
1206                </td>
1207</tr>
1208<tr>
1209<td>
1210                  <p>
1211                    <code class="literal">a?</code>
1212                  </p>
1213                </td>
1214<td>
1215                  <p>
1216                    <code class="computeroutput"><span class="special">!</span><span class="identifier">a</span></code>
1217                  </p>
1218                </td>
1219<td>
1220                  <p>
1221                    zero or one time, greedy.
1222                  </p>
1223                </td>
1224</tr>
1225<tr>
1226<td>
1227                  <p>
1228                    <code class="literal">a{n,m}</code>
1229                  </p>
1230                </td>
1231<td>
1232                  <p>
1233                    <code class="computeroutput"><a class="link" href="../boost/xpressive/repeat.html" title="Function repeat">repeat</a><span class="special">&lt;</span><span class="identifier">n</span><span class="special">,</span><span class="identifier">m</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span></code>
1234                  </p>
1235                </td>
1236<td>
1237                  <p>
1238                    between <code class="literal">n</code> and <code class="literal">m</code> times,
1239                    greedy.
1240                  </p>
1241                </td>
1242</tr>
1243<tr>
1244<td>
1245                  <p>
1246                    <code class="literal">a*?</code>
1247                  </p>
1248                </td>
1249<td>
1250                  <p>
1251                    <code class="computeroutput"><span class="special">-*</span><span class="identifier">a</span></code>
1252                  </p>
1253                </td>
1254<td>
1255                  <p>
1256                    zero or more times, non-greedy.
1257                  </p>
1258                </td>
1259</tr>
1260<tr>
1261<td>
1262                  <p>
1263                    <code class="literal">a+?</code>
1264                  </p>
1265                </td>
1266<td>
1267                  <p>
1268                    <code class="computeroutput"><span class="special">-+</span><span class="identifier">a</span></code>
1269                  </p>
1270                </td>
1271<td>
1272                  <p>
1273                    one or more times, non-greedy.
1274                  </p>
1275                </td>
1276</tr>
1277<tr>
1278<td>
1279                  <p>
1280                    <code class="literal">a??</code>
1281                  </p>
1282                </td>
1283<td>
1284                  <p>
1285                    <code class="computeroutput"><span class="special">-!</span><span class="identifier">a</span></code>
1286                  </p>
1287                </td>
1288<td>
1289                  <p>
1290                    zero or one time, non-greedy.
1291                  </p>
1292                </td>
1293</tr>
1294<tr>
1295<td>
1296                  <p>
1297                    <code class="literal">a{n,m}?</code>
1298                  </p>
1299                </td>
1300<td>
1301                  <p>
1302                    <code class="computeroutput"><span class="special">-</span><a class="link" href="../boost/xpressive/repeat.html" title="Function repeat">repeat</a><span class="special">&lt;</span><span class="identifier">n</span><span class="special">,</span><span class="identifier">m</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">)</span></code>
1303                  </p>
1304                </td>
1305<td>
1306                  <p>
1307                    between <code class="literal">n</code> and <code class="literal">m</code> times,
1308                    non-greedy.
1309                  </p>
1310                </td>
1311</tr>
1312<tr>
1313<td>
1314                  <p>
1315                    <code class="literal">^</code>
1316                  </p>
1317                </td>
1318<td>
1319                  <p>
1320                    <code class="computeroutput"><a class="link" href="../boost/xpressive/bos.html" title="Global bos">bos</a></code>
1321                  </p>
1322                </td>
1323<td>
1324                  <p>
1325                    beginning of sequence assertion.
1326                  </p>
1327                </td>
1328</tr>
1329<tr>
1330<td>
1331                  <p>
1332                    <code class="literal">$</code>
1333                  </p>
1334                </td>
1335<td>
1336                  <p>
1337                    <code class="computeroutput"><a class="link" href="../boost/xpressive/eos.html" title="Global eos">eos</a></code>
1338                  </p>
1339                </td>
1340<td>
1341                  <p>
1342                    end of sequence assertion.
1343                  </p>
1344                </td>
1345</tr>
1346<tr>
1347<td>
1348                  <p>
1349                    <code class="literal">\b</code>
1350                  </p>
1351                </td>
1352<td>
1353                  <p>
1354                    <code class="computeroutput"><a class="link" href="../boost/xpressive/_b.html" title="Global _b">_b</a></code>
1355                  </p>
1356                </td>
1357<td>
1358                  <p>
1359                    word boundary assertion.
1360                  </p>
1361                </td>
1362</tr>
1363<tr>
1364<td>
1365                  <p>
1366                    <code class="literal">\B</code>
1367                  </p>
1368                </td>
1369<td>
1370                  <p>
1371                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/_b.html" title="Global _b">_b</a></code>
1372                  </p>
1373                </td>
1374<td>
1375                  <p>
1376                    not word boundary assertion.
1377                  </p>
1378                </td>
1379</tr>
1380<tr>
1381<td>
1382                  <p>
1383                    <code class="literal">\n</code>
1384                  </p>
1385                </td>
1386<td>
1387                  <p>
1388                    <code class="computeroutput"><a class="link" href="../boost/xpressive/_n.html" title="Global _n">_n</a></code>
1389                  </p>
1390                </td>
1391<td>
1392                  <p>
1393                    literal newline.
1394                  </p>
1395                </td>
1396</tr>
1397<tr>
1398<td>
1399                  <p>
1400                    <code class="literal">.</code>
1401                  </p>
1402                </td>
1403<td>
1404                  <p>
1405                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/_n.html" title="Global _n">_n</a></code>
1406                  </p>
1407                </td>
1408<td>
1409                  <p>
1410                    any character except a literal newline (without Perl's /s modifier).
1411                  </p>
1412                </td>
1413</tr>
1414<tr>
1415<td>
1416                  <p>
1417                    <code class="literal">\r?\n|\r</code>
1418                  </p>
1419                </td>
1420<td>
1421                  <p>
1422                    <code class="computeroutput"><a class="link" href="../boost/xpressive/_ln.html" title="Global _ln">_ln</a></code>
1423                  </p>
1424                </td>
1425<td>
1426                  <p>
1427                    logical newline.
1428                  </p>
1429                </td>
1430</tr>
1431<tr>
1432<td>
1433                  <p>
1434                    <code class="literal">[^\r\n]</code>
1435                  </p>
1436                </td>
1437<td>
1438                  <p>
1439                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/_ln.html" title="Global _ln">_ln</a></code>
1440                  </p>
1441                </td>
1442<td>
1443                  <p>
1444                    any single character not a logical newline.
1445                  </p>
1446                </td>
1447</tr>
1448<tr>
1449<td>
1450                  <p>
1451                    <code class="literal">\w</code>
1452                  </p>
1453                </td>
1454<td>
1455                  <p>
1456                    <code class="computeroutput"><a class="link" href="../boost/xpressive/_w.html" title="Global _w">_w</a></code>
1457                  </p>
1458                </td>
1459<td>
1460                  <p>
1461                    a word character, equivalent to set[alnum | '_'].
1462                  </p>
1463                </td>
1464</tr>
1465<tr>
1466<td>
1467                  <p>
1468                    <code class="literal">\W</code>
1469                  </p>
1470                </td>
1471<td>
1472                  <p>
1473                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/_w.html" title="Global _w">_w</a></code>
1474                  </p>
1475                </td>
1476<td>
1477                  <p>
1478                    not a word character, equivalent to ~set[alnum | '_'].
1479                  </p>
1480                </td>
1481</tr>
1482<tr>
1483<td>
1484                  <p>
1485                    <code class="literal">\d</code>
1486                  </p>
1487                </td>
1488<td>
1489                  <p>
1490                    <code class="computeroutput"><a class="link" href="../boost/xpressive/_d.html" title="Global _d">_d</a></code>
1491                  </p>
1492                </td>
1493<td>
1494                  <p>
1495                    a digit character.
1496                  </p>
1497                </td>
1498</tr>
1499<tr>
1500<td>
1501                  <p>
1502                    <code class="literal">\D</code>
1503                  </p>
1504                </td>
1505<td>
1506                  <p>
1507                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/_d.html" title="Global _d">_d</a></code>
1508                  </p>
1509                </td>
1510<td>
1511                  <p>
1512                    not a digit character.
1513                  </p>
1514                </td>
1515</tr>
1516<tr>
1517<td>
1518                  <p>
1519                    <code class="literal">\s</code>
1520                  </p>
1521                </td>
1522<td>
1523                  <p>
1524                    <code class="computeroutput"><a class="link" href="../boost/xpressive/_s.html" title="Global _s">_s</a></code>
1525                  </p>
1526                </td>
1527<td>
1528                  <p>
1529                    a space character.
1530                  </p>
1531                </td>
1532</tr>
1533<tr>
1534<td>
1535                  <p>
1536                    <code class="literal">\S</code>
1537                  </p>
1538                </td>
1539<td>
1540                  <p>
1541                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/_s.html" title="Global _s">_s</a></code>
1542                  </p>
1543                </td>
1544<td>
1545                  <p>
1546                    not a space character.
1547                  </p>
1548                </td>
1549</tr>
1550<tr>
1551<td>
1552                  <p>
1553                    <code class="literal">[:alnum:]</code>
1554                  </p>
1555                </td>
1556<td>
1557                  <p>
1558                    <code class="computeroutput"><a class="link" href="../boost/xpressive/alnum.html" title="Global alnum">alnum</a></code>
1559                  </p>
1560                </td>
1561<td>
1562                  <p>
1563                    an alpha-numeric character.
1564                  </p>
1565                </td>
1566</tr>
1567<tr>
1568<td>
1569                  <p>
1570                    <code class="literal">[:alpha:]</code>
1571                  </p>
1572                </td>
1573<td>
1574                  <p>
1575                    <code class="computeroutput"><a class="link" href="../boost/xpressive/alpha.html" title="Global alpha">alpha</a></code>
1576                  </p>
1577                </td>
1578<td>
1579                  <p>
1580                    an alphabetic character.
1581                  </p>
1582                </td>
1583</tr>
1584<tr>
1585<td>
1586                  <p>
1587                    <code class="literal">[:blank:]</code>
1588                  </p>
1589                </td>
1590<td>
1591                  <p>
1592                    <code class="computeroutput"><a class="link" href="../boost/xpressive/blank.html" title="Global blank">blank</a></code>
1593                  </p>
1594                </td>
1595<td>
1596                  <p>
1597                    a horizontal white-space character.
1598                  </p>
1599                </td>
1600</tr>
1601<tr>
1602<td>
1603                  <p>
1604                    <code class="literal">[:cntrl:]</code>
1605                  </p>
1606                </td>
1607<td>
1608                  <p>
1609                    <code class="computeroutput"><a class="link" href="../boost/xpressive/cntrl.html" title="Global cntrl">cntrl</a></code>
1610                  </p>
1611                </td>
1612<td>
1613                  <p>
1614                    a control character.
1615                  </p>
1616                </td>
1617</tr>
1618<tr>
1619<td>
1620                  <p>
1621                    <code class="literal">[:digit:]</code>
1622                  </p>
1623                </td>
1624<td>
1625                  <p>
1626                    <code class="computeroutput"><a class="link" href="../boost/xpressive/digit.html" title="Global digit">digit</a></code>
1627                  </p>
1628                </td>
1629<td>
1630                  <p>
1631                    a digit character.
1632                  </p>
1633                </td>
1634</tr>
1635<tr>
1636<td>
1637                  <p>
1638                    <code class="literal">[:graph:]</code>
1639                  </p>
1640                </td>
1641<td>
1642                  <p>
1643                    <code class="computeroutput"><a class="link" href="../boost/xpressive/graph.html" title="Global graph">graph</a></code>
1644                  </p>
1645                </td>
1646<td>
1647                  <p>
1648                    a graphable character.
1649                  </p>
1650                </td>
1651</tr>
1652<tr>
1653<td>
1654                  <p>
1655                    <code class="literal">[:lower:]</code>
1656                  </p>
1657                </td>
1658<td>
1659                  <p>
1660                    <code class="computeroutput"><a class="link" href="../boost/xpressive/lower.html" title="Global lower">lower</a></code>
1661                  </p>
1662                </td>
1663<td>
1664                  <p>
1665                    a lower-case character.
1666                  </p>
1667                </td>
1668</tr>
1669<tr>
1670<td>
1671                  <p>
1672                    <code class="literal">[:print:]</code>
1673                  </p>
1674                </td>
1675<td>
1676                  <p>
1677                    <code class="computeroutput"><a class="link" href="../boost/xpressive/print.html" title="Global print">print</a></code>
1678                  </p>
1679                </td>
1680<td>
1681                  <p>
1682                    a printing character.
1683                  </p>
1684                </td>
1685</tr>
1686<tr>
1687<td>
1688                  <p>
1689                    <code class="literal">[:punct:]</code>
1690                  </p>
1691                </td>
1692<td>
1693                  <p>
1694                    <code class="computeroutput"><a class="link" href="../boost/xpressive/punct.html" title="Global punct">punct</a></code>
1695                  </p>
1696                </td>
1697<td>
1698                  <p>
1699                    a punctuation character.
1700                  </p>
1701                </td>
1702</tr>
1703<tr>
1704<td>
1705                  <p>
1706                    <code class="literal">[:space:]</code>
1707                  </p>
1708                </td>
1709<td>
1710                  <p>
1711                    <code class="computeroutput"><a class="link" href="../boost/xpressive/space.html" title="Global space">space</a></code>
1712                  </p>
1713                </td>
1714<td>
1715                  <p>
1716                    a white-space character.
1717                  </p>
1718                </td>
1719</tr>
1720<tr>
1721<td>
1722                  <p>
1723                    <code class="literal">[:upper:]</code>
1724                  </p>
1725                </td>
1726<td>
1727                  <p>
1728                    <code class="computeroutput"><a class="link" href="../boost/xpressive/upper.html" title="Global upper">upper</a></code>
1729                  </p>
1730                </td>
1731<td>
1732                  <p>
1733                    an upper-case character.
1734                  </p>
1735                </td>
1736</tr>
1737<tr>
1738<td>
1739                  <p>
1740                    <code class="literal">[:xdigit:]</code>
1741                  </p>
1742                </td>
1743<td>
1744                  <p>
1745                    <code class="computeroutput"><a class="link" href="../boost/xpressive/xdigit.html" title="Global xdigit">xdigit</a></code>
1746                  </p>
1747                </td>
1748<td>
1749                  <p>
1750                    a hexadecimal digit character.
1751                  </p>
1752                </td>
1753</tr>
1754<tr>
1755<td>
1756                  <p>
1757                    <code class="literal">[0-9]</code>
1758                  </p>
1759                </td>
1760<td>
1761                  <p>
1762                    <code class="computeroutput"><a class="link" href="../boost/xpressive/range.html" title="Function template range">range</a><span class="special">(</span><span class="char">'0'</span><span class="special">,</span><span class="char">'9'</span><span class="special">)</span></code>
1763                  </p>
1764                </td>
1765<td>
1766                  <p>
1767                    characters in range <code class="computeroutput"><span class="char">'0'</span></code>
1768                    through <code class="computeroutput"><span class="char">'9'</span></code>.
1769                  </p>
1770                </td>
1771</tr>
1772<tr>
1773<td>
1774                  <p>
1775                    <code class="literal">[abc]</code>
1776                  </p>
1777                </td>
1778<td>
1779                  <p>
1780                    <code class="computeroutput"><span class="identifier">as_xpr</span><span class="special">(</span><span class="char">'a'</span><span class="special">)</span> <span class="special">|</span> <span class="char">'b'</span> <span class="special">|</span><span class="char">'c'</span></code>
1781                  </p>
1782                </td>
1783<td>
1784                  <p>
1785                    characters <code class="computeroutput"><span class="char">'a'</span></code>, <code class="computeroutput"><span class="char">'b'</span></code>, or <code class="computeroutput"><span class="char">'c'</span></code>.
1786                  </p>
1787                </td>
1788</tr>
1789<tr>
1790<td>
1791                  <p>
1792                    <code class="literal">[abc]</code>
1793                  </p>
1794                </td>
1795<td>
1796                  <p>
1797                    <code class="computeroutput"><span class="special">(</span><a class="link" href="../boost/xpressive/set.html" title="Global set">set</a><span class="special">=</span> <span class="char">'a'</span><span class="special">,</span><span class="char">'b'</span><span class="special">,</span><span class="char">'c'</span><span class="special">)</span></code>
1798                  </p>
1799                </td>
1800<td>
1801                  <p>
1802                    <span class="emphasis"><em>same as above</em></span>
1803                  </p>
1804                </td>
1805</tr>
1806<tr>
1807<td>
1808                  <p>
1809                    <code class="literal">[0-9abc]</code>
1810                  </p>
1811                </td>
1812<td>
1813                  <p>
1814                    <code class="computeroutput"><a class="link" href="../boost/xpressive/set.html" title="Global set">set</a><span class="special">[</span> <a class="link" href="../boost/xpressive/range.html" title="Function template range">range</a><span class="special">(</span><span class="char">'0'</span><span class="special">,</span><span class="char">'9'</span><span class="special">)</span> <span class="special">|</span>
1815                    <span class="char">'a'</span> <span class="special">|</span>
1816                    <span class="char">'b'</span> <span class="special">|</span>
1817                    <span class="char">'c'</span> <span class="special">]</span></code>
1818                  </p>
1819                </td>
1820<td>
1821                  <p>
1822                    characters <code class="computeroutput"><span class="char">'a'</span></code>, <code class="computeroutput"><span class="char">'b'</span></code>, <code class="computeroutput"><span class="char">'c'</span></code>
1823                    or in range <code class="computeroutput"><span class="char">'0'</span></code> through
1824                    <code class="computeroutput"><span class="char">'9'</span></code>.
1825                  </p>
1826                </td>
1827</tr>
1828<tr>
1829<td>
1830                  <p>
1831                    <code class="literal">[0-9abc]</code>
1832                  </p>
1833                </td>
1834<td>
1835                  <p>
1836                    <code class="computeroutput"><a class="link" href="../boost/xpressive/set.html" title="Global set">set</a><span class="special">[</span> <a class="link" href="../boost/xpressive/range.html" title="Function template range">range</a><span class="special">(</span><span class="char">'0'</span><span class="special">,</span><span class="char">'9'</span><span class="special">)</span> <span class="special">|</span>
1837                    <span class="special">(</span><a class="link" href="../boost/xpressive/set.html" title="Global set">set</a><span class="special">=</span> <span class="char">'a'</span><span class="special">,</span><span class="char">'b'</span><span class="special">,</span><span class="char">'c'</span><span class="special">)</span> <span class="special">]</span></code>
1838                  </p>
1839                </td>
1840<td>
1841                  <p>
1842                    <span class="emphasis"><em>same as above</em></span>
1843                  </p>
1844                </td>
1845</tr>
1846<tr>
1847<td>
1848                  <p>
1849                    <code class="literal">[^abc]</code>
1850                  </p>
1851                </td>
1852<td>
1853                  <p>
1854                    <code class="computeroutput"><span class="special">~(</span><a class="link" href="../boost/xpressive/set.html" title="Global set">set</a><span class="special">=</span> <span class="char">'a'</span><span class="special">,</span><span class="char">'b'</span><span class="special">,</span><span class="char">'c'</span><span class="special">)</span></code>
1855                  </p>
1856                </td>
1857<td>
1858                  <p>
1859                    not characters <code class="computeroutput"><span class="char">'a'</span></code>,
1860                    <code class="computeroutput"><span class="char">'b'</span></code>, or <code class="computeroutput"><span class="char">'c'</span></code>.
1861                  </p>
1862                </td>
1863</tr>
1864<tr>
1865<td>
1866                  <p>
1867                    <code class="literal">(?i:<span class="emphasis"><em>stuff</em></span>)</code>
1868                  </p>
1869                </td>
1870<td>
1871                  <p>
1872                    <code class="computeroutput"><a class="link" href="../boost/xpressive/icase.html" title="Function template icase">icase</a><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>stuff</em></span></code><code class="computeroutput"><span class="special">)</span></code>
1873                  </p>
1874                </td>
1875<td>
1876                  <p>
1877                    match <span class="emphasis"><em>stuff</em></span> disregarding case.
1878                  </p>
1879                </td>
1880</tr>
1881<tr>
1882<td>
1883                  <p>
1884                    <code class="literal">(?&gt;<span class="emphasis"><em>stuff</em></span>)</code>
1885                  </p>
1886                </td>
1887<td>
1888                  <p>
1889                    <code class="computeroutput"><a class="link" href="../boost/xpressive/keep.html" title="Function template keep">keep</a><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>stuff</em></span></code><code class="computeroutput"><span class="special">)</span></code>
1890                  </p>
1891                </td>
1892<td>
1893                  <p>
1894                    independent sub-expression, match <span class="emphasis"><em>stuff</em></span>
1895                    and turn off backtracking.
1896                  </p>
1897                </td>
1898</tr>
1899<tr>
1900<td>
1901                  <p>
1902                    <code class="literal">(?=<span class="emphasis"><em>stuff</em></span>)</code>
1903                  </p>
1904                </td>
1905<td>
1906                  <p>
1907                    <code class="computeroutput"><a class="link" href="../boost/xpressive/before.html" title="Function template before">before</a><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>stuff</em></span></code><code class="computeroutput"><span class="special">)</span></code>
1908                  </p>
1909                </td>
1910<td>
1911                  <p>
1912                    positive look-ahead assertion, match if before <span class="emphasis"><em>stuff</em></span>
1913                    but don't include <span class="emphasis"><em>stuff</em></span> in the match.
1914                  </p>
1915                </td>
1916</tr>
1917<tr>
1918<td>
1919                  <p>
1920                    <code class="literal">(?!<span class="emphasis"><em>stuff</em></span>)</code>
1921                  </p>
1922                </td>
1923<td>
1924                  <p>
1925                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/before.html" title="Function template before">before</a><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>stuff</em></span></code><code class="computeroutput"><span class="special">)</span></code>
1926                  </p>
1927                </td>
1928<td>
1929                  <p>
1930                    negative look-ahead assertion, match if not before <span class="emphasis"><em>stuff</em></span>.
1931                  </p>
1932                </td>
1933</tr>
1934<tr>
1935<td>
1936                  <p>
1937                    <code class="literal">(?&lt;=<span class="emphasis"><em>stuff</em></span>)</code>
1938                  </p>
1939                </td>
1940<td>
1941                  <p>
1942                    <code class="computeroutput"><a class="link" href="../boost/xpressive/after.html" title="Function template after">after</a><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>stuff</em></span></code><code class="computeroutput"><span class="special">)</span></code>
1943                  </p>
1944                </td>
1945<td>
1946                  <p>
1947                    positive look-behind assertion, match if after <span class="emphasis"><em>stuff</em></span>
1948                    but don't include <span class="emphasis"><em>stuff</em></span> in the match. (<span class="emphasis"><em>stuff</em></span>
1949                    must be constant-width.)
1950                  </p>
1951                </td>
1952</tr>
1953<tr>
1954<td>
1955                  <p>
1956                    <code class="literal">(?&lt;!<span class="emphasis"><em>stuff</em></span>)</code>
1957                  </p>
1958                </td>
1959<td>
1960                  <p>
1961                    <code class="computeroutput"><span class="special">~</span><a class="link" href="../boost/xpressive/after.html" title="Function template after">after</a><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>stuff</em></span></code><code class="computeroutput"><span class="special">)</span></code>
1962                  </p>
1963                </td>
1964<td>
1965                  <p>
1966                    negative look-behind assertion, match if not after <span class="emphasis"><em>stuff</em></span>.
1967                    (<span class="emphasis"><em>stuff</em></span> must be constant-width.)
1968                  </p>
1969                </td>
1970</tr>
1971<tr>
1972<td>
1973                  <p>
1974                    <code class="literal">(?P&lt;<span class="emphasis"><em>name</em></span>&gt;<span class="emphasis"><em>stuff</em></span>)</code>
1975                  </p>
1976                </td>
1977<td>
1978                  <p>
1979                    <code class="computeroutput"><code class="literal"><a class="link" href="../boost/xpressive/mark_tag.html" title="Struct mark_tag">mark_tag</a></code>
1980                    </code><code class="literal"><span class="emphasis"><em>name</em></span></code><code class="computeroutput"><span class="special">(</span></code><span class="emphasis"><em>n</em></span><code class="computeroutput"><span class="special">);</span></code><br> ...<br> <code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>name</em></span></code><code class="computeroutput"><span class="special">=</span> </code><code class="literal"><span class="emphasis"><em>stuff</em></span></code><code class="computeroutput"><span class="special">)</span></code>
1981                  </p>
1982                </td>
1983<td>
1984                  <p>
1985                    Create a named capture.
1986                  </p>
1987                </td>
1988</tr>
1989<tr>
1990<td>
1991                  <p>
1992                    <code class="literal">(?P=<span class="emphasis"><em>name</em></span>)</code>
1993                  </p>
1994                </td>
1995<td>
1996                  <p>
1997                    <code class="computeroutput"><code class="literal"><a class="link" href="../boost/xpressive/mark_tag.html" title="Struct mark_tag">mark_tag</a></code>
1998                    </code><code class="literal"><span class="emphasis"><em>name</em></span></code><code class="computeroutput"><span class="special">(</span></code><span class="emphasis"><em>n</em></span><code class="computeroutput"><span class="special">);</span></code><br> ...<br> <code class="literal"><span class="emphasis"><em>name</em></span></code>
1999                  </p>
2000                </td>
2001<td>
2002                  <p>
2003                    Refer back to a previously created named capture.
2004                  </p>
2005                </td>
2006</tr>
2007</tbody>
2008</table></div>
2009</div>
2010<br class="table-break"><p>
2011          <br>
2012        </p>
2013</div>
2014<div class="section">
2015<div class="titlepage"><div><div><h4 class="title">
2016<a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes" title="Dynamic Regexes">Dynamic
2017        Regexes</a>
2018</h4></div></div></div>
2019<h3>
2020<a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.h0"></a>
2021          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.overview">Overview</a>
2022        </h3>
2023<p>
2024          Static regexes are dandy, but sometimes you need something a bit more ...
2025          dynamic. Imagine you are developing a text editor with a regex search/replace
2026          feature. You need to accept a regular expression from the end user as input
2027          at run-time. There should be a way to parse a string into a regular expression.
2028          That's what xpressive's dynamic regexes are for. They are built from the
2029          same core components as their static counterparts, but they are late-bound
2030          so you can specify them at run-time.
2031        </p>
2032<h3>
2033<a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.h1"></a>
2034          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.construction_and_assignment"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.construction_and_assignment">Construction
2035          and Assignment</a>
2036        </h3>
2037<p>
2038          There are two ways to create a dynamic regex: with the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html#id-1_3_47_5_18_2_1_1_9_1-bb">basic_regex&lt;&gt;::compile()</a></code></code>
2039          function or with the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
2040          class template. Use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html#id-1_3_47_5_18_2_1_1_9_1-bb">basic_regex&lt;&gt;::compile()</a></code></code>
2041          if you want the default locale. Use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
2042          if you need to specify a different locale. In the section on <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches" title="Grammars and Nested Matches">regex
2043          grammars</a>, we'll see another use for <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>.
2044        </p>
2045<p>
2046          Here is an example of using <code class="computeroutput"><span class="identifier">basic_regex</span><span class="special">&lt;&gt;::</span><span class="identifier">compile</span><span class="special">()</span></code>:
2047        </p>
2048<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"this|that"</span><span class="special">,</span> <span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">icase</span> <span class="special">);</span>
2049</pre>
2050<p>
2051          Here is the same example using <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>:
2052        </p>
2053<pre class="programlisting"><span class="identifier">sregex_compiler</span> <span class="identifier">compiler</span><span class="special">;</span>
2054<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">compiler</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"this|that"</span><span class="special">,</span> <span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">icase</span> <span class="special">);</span>
2055</pre>
2056<p>
2057          <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html#id-1_3_47_5_18_2_1_1_9_1-bb">basic_regex&lt;&gt;::compile()</a></code></code>
2058          is implemented in terms of <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>.
2059        </p>
2060<h3>
2061<a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.h2"></a>
2062          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.dynamic_xpressive_syntax"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.dynamic_xpressive_syntax">Dynamic
2063          xpressive Syntax</a>
2064        </h3>
2065<p>
2066          Since the dynamic syntax is not constrained by the rules for valid C++
2067          expressions, we are free to use familiar syntax for dynamic regexes. For
2068          this reason, the syntax used by xpressive for dynamic regexes follows the
2069          lead set by John Maddock's <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1429.htm" target="_top">proposal</a>
2070          to add regular expressions to the Standard Library. It is essentially the
2071          syntax standardized by <a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf" target="_top">ECMAScript</a>,
2072          with minor changes in support of internationalization.
2073        </p>
2074<p>
2075          Since the syntax is documented exhaustively elsewhere, I will simply refer
2076          you to the existing standards, rather than duplicate the specification
2077          here.
2078        </p>
2079<h3>
2080<a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.h3"></a>
2081          <span class="phrase"><a name="boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.internationalization"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.creating_a_regex_object.dynamic_regexes.internationalization">Internationalization</a>
2082        </h3>
2083<p>
2084          As with static regexes, dynamic regexes support internationalization by
2085          allowing you to specify a different <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span></code>.
2086          To do this, you must use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>.
2087          The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
2088          class has an <code class="computeroutput"><span class="identifier">imbue</span><span class="special">()</span></code>
2089          function. After you have imbued a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
2090          object with a custom <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span></code>,
2091          all regex objects compiled by that <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
2092          will use that locale. For example:
2093        </p>
2094<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span> <span class="identifier">my_locale</span> <span class="special">=</span> <span class="comment">/* initialize your locale object here */</span><span class="special">;</span>
2095<span class="identifier">sregex_compiler</span> <span class="identifier">compiler</span><span class="special">;</span>
2096<span class="identifier">compiler</span><span class="special">.</span><span class="identifier">imbue</span><span class="special">(</span> <span class="identifier">my_locale</span> <span class="special">);</span>
2097<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">compiler</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"\\w+|\\d+"</span> <span class="special">);</span>
2098</pre>
2099<p>
2100          This regex will use <code class="computeroutput"><span class="identifier">my_locale</span></code>
2101          when evaluating the intrinsic character sets <code class="computeroutput"><span class="string">"\\w"</span></code>
2102          and <code class="computeroutput"><span class="string">"\\d"</span></code>.
2103        </p>
2104</div>
2105</div>
2106<div class="section">
2107<div class="titlepage"><div><div><h3 class="title">
2108<a name="boost_xpressive.user_s_guide.matching_and_searching"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.matching_and_searching" title="Matching and Searching">Matching
2109      and Searching</a>
2110</h3></div></div></div>
2111<h3>
2112<a name="boost_xpressive.user_s_guide.matching_and_searching.h0"></a>
2113        <span class="phrase"><a name="boost_xpressive.user_s_guide.matching_and_searching.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.matching_and_searching.overview">Overview</a>
2114      </h3>
2115<p>
2116        Once you have created a regex object, you can use the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2117        and <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2118        algorithms to find patterns in strings. This page covers the basics of regex
2119        matching and searching. In all cases, if you are familiar with how <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2120        and <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2121        in the <a href="../../../libs/regex" target="_top">Boost.Regex</a> library work, xpressive's
2122        versions work the same way.
2123      </p>
2124<h3>
2125<a name="boost_xpressive.user_s_guide.matching_and_searching.h1"></a>
2126        <span class="phrase"><a name="boost_xpressive.user_s_guide.matching_and_searching.seeing_if_a_string_matches_a_regex"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.matching_and_searching.seeing_if_a_string_matches_a_regex">Seeing
2127        if a String Matches a Regex</a>
2128      </h3>
2129<p>
2130        The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2131        algorithm checks to see if a regex matches a given input.
2132      </p>
2133<div class="warning"><table border="0" summary="Warning">
2134<tr>
2135<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
2136<th align="left">Warning</th>
2137</tr>
2138<tr><td align="left" valign="top"><p>
2139          The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2140          algorithm will only report success if the regex matches the <span class="emphasis"><em>whole
2141          input</em></span>, from beginning to end. If the regex matches only a part
2142          of the input, <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2143          will return false. If you want to search through the string looking for
2144          sub-strings that the regex matches, use the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2145          algorithm.
2146        </p></td></tr>
2147</table></div>
2148<p>
2149        The input can be a bidirectional range such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>,
2150        a C-style null-terminated string or a pair of iterators. In all cases, the
2151        type of the iterator used to traverse the input sequence must match the iterator
2152        type used to declare the regex object. (You can use the table in the <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.quick_start.know_your_iterator_type">Quick
2153        Start</a> to find the correct regex type for your iterator.)
2154      </p>
2155<pre class="programlisting"><span class="identifier">cregex</span> <span class="identifier">cre</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">;</span>  <span class="comment">// this regex can match C-style strings</span>
2156<span class="identifier">sregex</span> <span class="identifier">sre</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">;</span>  <span class="comment">// this regex can match std::strings</span>
2157
2158<span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="string">"hello"</span><span class="special">,</span> <span class="identifier">cre</span> <span class="special">)</span> <span class="special">)</span>              <span class="comment">// OK</span>
2159    <span class="special">{</span> <span class="comment">/*...*/</span> <span class="special">}</span>
2160
2161<span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"hello"</span><span class="special">),</span> <span class="identifier">sre</span> <span class="special">)</span> <span class="special">)</span> <span class="comment">// OK</span>
2162    <span class="special">{</span> <span class="comment">/*...*/</span> <span class="special">}</span>
2163
2164<span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="string">"hello"</span><span class="special">,</span> <span class="identifier">sre</span> <span class="special">)</span> <span class="special">)</span>              <span class="comment">// ERROR! iterator mis-match!</span>
2165    <span class="special">{</span> <span class="comment">/*...*/</span> <span class="special">}</span>
2166</pre>
2167<p>
2168        The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2169        algorithm optionally accepts a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2170        struct as an out parameter. If given, the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2171        algorithm fills in the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2172        struct with information about which parts of the regex matched which parts
2173        of the input.
2174      </p>
2175<pre class="programlisting"><span class="identifier">cmatch</span> <span class="identifier">what</span><span class="special">;</span>
2176<span class="identifier">cregex</span> <span class="identifier">cre</span> <span class="special">=</span> <span class="special">+(</span><span class="identifier">s1</span><span class="special">=</span> <span class="identifier">_w</span><span class="special">);</span>
2177
2178<span class="comment">// store the results of the regex_match in "what"</span>
2179<span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="string">"hello"</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">cre</span> <span class="special">)</span> <span class="special">)</span>
2180<span class="special">{</span>
2181    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// prints "o"</span>
2182<span class="special">}</span>
2183</pre>
2184<p>
2185        The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2186        algorithm also optionally accepts a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_constants/match_flag_type.html" title="Type match_flag_type">match_flag_type</a></code></code>
2187        bitmask. With <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_constants/match_flag_type.html" title="Type match_flag_type">match_flag_type</a></code></code>,
2188        you can control certain aspects of how the match is evaluated. See the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_constants/match_flag_type.html" title="Type match_flag_type">match_flag_type</a></code></code>
2189        reference for a complete list of the flags and their meanings.
2190      </p>
2191<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"hello"</span><span class="special">);</span>
2192<span class="identifier">sregex</span> <span class="identifier">sre</span> <span class="special">=</span> <span class="identifier">bol</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">;</span>
2193
2194<span class="comment">// match_not_bol means that "bol" should not match at [begin,begin)</span>
2195<span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">sre</span><span class="special">,</span> <span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">match_not_bol</span> <span class="special">)</span> <span class="special">)</span>
2196<span class="special">{</span>
2197    <span class="comment">// should never get here!!!</span>
2198<span class="special">}</span>
2199</pre>
2200<p>
2201        Click <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.see_if_a_whole_string_matches_a_regex">here</a>
2202        to see a complete example program that shows how to use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>.
2203        And check the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2204        reference to see a complete list of the available overloads.
2205      </p>
2206<h3>
2207<a name="boost_xpressive.user_s_guide.matching_and_searching.h2"></a>
2208        <span class="phrase"><a name="boost_xpressive.user_s_guide.matching_and_searching.searching_for_matching_sub_strings"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.matching_and_searching.searching_for_matching_sub_strings">Searching
2209        for Matching Sub-Strings</a>
2210      </h3>
2211<p>
2212        Use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2213        when you want to know if an input sequence contains a sub-sequence that a
2214        regex matches. <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2215        will try to match the regex at the beginning of the input sequence and scan
2216        forward in the sequence until it either finds a match or exhausts the sequence.
2217      </p>
2218<p>
2219        In all other regards, <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2220        behaves like <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2221        <span class="emphasis"><em>(see above)</em></span>. In particular, it can operate on a bidirectional
2222        range such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>, C-style null-terminated strings
2223        or iterator ranges. The same care must be taken to ensure that the iterator
2224        type of your regex matches the iterator type of your input sequence. As with
2225        <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>,
2226        you can optionally provide a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2227        struct to receive the results of the search, and a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_constants/match_flag_type.html" title="Type match_flag_type">match_flag_type</a></code></code>
2228        bitmask to control how the match is evaluated.
2229      </p>
2230<p>
2231        Click <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.see_if_a_string_contains_a_sub_string_that_matches_a_regex">here</a>
2232        to see a complete example program that shows how to use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>.
2233        And check the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2234        reference to see a complete list of the available overloads.
2235      </p>
2236</div>
2237<div class="section">
2238<div class="titlepage"><div><div><h3 class="title">
2239<a name="boost_xpressive.user_s_guide.accessing_results"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.accessing_results" title="Accessing Results">Accessing
2240      Results</a>
2241</h3></div></div></div>
2242<h3>
2243<a name="boost_xpressive.user_s_guide.accessing_results.h0"></a>
2244        <span class="phrase"><a name="boost_xpressive.user_s_guide.accessing_results.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.accessing_results.overview">Overview</a>
2245      </h3>
2246<p>
2247        Sometimes, it is not enough to know simply whether a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2248        or <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
2249        was successful or not. If you pass an object of type <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2250        to <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
2251        or <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>,
2252        then after the algorithm has completed successfully the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2253        will contain extra information about which parts of the regex matched which
2254        parts of the sequence. In Perl, these sub-sequences are called <span class="emphasis"><em>back-references</em></span>,
2255        and they are stored in the variables <code class="literal">$1</code>, <code class="literal">$2</code>,
2256        etc. In xpressive, they are objects of type <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>,
2257        and they are stored in the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2258        structure, which acts as a vector of <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2259        objects.
2260      </p>
2261<h3>
2262<a name="boost_xpressive.user_s_guide.accessing_results.h1"></a>
2263        <span class="phrase"><a name="boost_xpressive.user_s_guide.accessing_results.match_results"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.accessing_results.match_results">match_results</a>
2264      </h3>
2265<p>
2266        So, you've passed a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2267        object to a regex algorithm, and the algorithm has succeeded. Now you want
2268        to examine the results. Most of what you'll be doing with the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2269        object is indexing into it to access its internally stored <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2270        objects, but there are a few other things you can do with a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2271        object besides.
2272      </p>
2273<p>
2274        The table below shows how to access the information stored in a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2275        object named <code class="computeroutput"><span class="identifier">what</span></code>.
2276      </p>
2277<div class="table">
2278<a name="boost_xpressive.user_s_guide.accessing_results.t0"></a><p class="title"><b>Table 46.5. match_results&lt;&gt; Accessors</b></p>
2279<div class="table-contents"><table class="table" summary="match_results&lt;&gt; Accessors">
2280<colgroup>
2281<col>
2282<col>
2283</colgroup>
2284<thead><tr>
2285<th>
2286                <p>
2287                  Accessor
2288                </p>
2289              </th>
2290<th>
2291                <p>
2292                  Effects
2293                </p>
2294              </th>
2295</tr></thead>
2296<tbody>
2297<tr>
2298<td>
2299                <p>
2300                  <code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code>
2301                </p>
2302              </td>
2303<td>
2304                <p>
2305                  Returns the number of sub-matches, which is always greater than
2306                  zero after a successful match because the full match is stored
2307                  in the zero-th sub-match.
2308                </p>
2309              </td>
2310</tr>
2311<tr>
2312<td>
2313                <p>
2314                  <code class="computeroutput"><span class="identifier">what</span><span class="special">[</span><span class="identifier">n</span><span class="special">]</span></code>
2315                </p>
2316              </td>
2317<td>
2318                <p>
2319                  Returns the <span class="emphasis"><em>n</em></span>-th sub-match.
2320                </p>
2321              </td>
2322</tr>
2323<tr>
2324<td>
2325                <p>
2326                  <code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">length</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>
2327                </p>
2328              </td>
2329<td>
2330                <p>
2331                  Returns the length of the <span class="emphasis"><em>n</em></span>-th sub-match.
2332                  Same as <code class="computeroutput"><span class="identifier">what</span><span class="special">[</span><span class="identifier">n</span><span class="special">].</span><span class="identifier">length</span><span class="special">()</span></code>.
2333                </p>
2334              </td>
2335</tr>
2336<tr>
2337<td>
2338                <p>
2339                  <code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">position</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>
2340                </p>
2341              </td>
2342<td>
2343                <p>
2344                  Returns the offset into the input sequence at which the <span class="emphasis"><em>n</em></span>-th
2345                  sub-match begins.
2346                </p>
2347              </td>
2348</tr>
2349<tr>
2350<td>
2351                <p>
2352                  <code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">str</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code>
2353                </p>
2354              </td>
2355<td>
2356                <p>
2357                  Returns a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_string</span><span class="special">&lt;&gt;</span></code>
2358                  constructed from the <span class="emphasis"><em>n</em></span>-th sub-match. Same
2359                  as <code class="computeroutput"><span class="identifier">what</span><span class="special">[</span><span class="identifier">n</span><span class="special">].</span><span class="identifier">str</span><span class="special">()</span></code>.
2360                </p>
2361              </td>
2362</tr>
2363<tr>
2364<td>
2365                <p>
2366                  <code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">prefix</span><span class="special">()</span></code>
2367                </p>
2368              </td>
2369<td>
2370                <p>
2371                  Returns a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2372                  object which represents the sub-sequence from the beginning of
2373                  the input sequence to the start of the full match.
2374                </p>
2375              </td>
2376</tr>
2377<tr>
2378<td>
2379                <p>
2380                  <code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">suffix</span><span class="special">()</span></code>
2381                </p>
2382              </td>
2383<td>
2384                <p>
2385                  Returns a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2386                  object which represents the sub-sequence from the end of the full
2387                  match to the end of the input sequence.
2388                </p>
2389              </td>
2390</tr>
2391<tr>
2392<td>
2393                <p>
2394                  <code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">regex_id</span><span class="special">()</span></code>
2395                </p>
2396              </td>
2397<td>
2398                <p>
2399                  Returns the <code class="computeroutput"><span class="identifier">regex_id</span></code>
2400                  of the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
2401                  object that was last used with this <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2402                  object.
2403                </p>
2404              </td>
2405</tr>
2406</tbody>
2407</table></div>
2408</div>
2409<br class="table-break"><p>
2410        There is more you can do with the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2411        object, but that will be covered when we talk about <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches" title="Grammars and Nested Matches">Grammars
2412        and Nested Matches</a>.
2413      </p>
2414<h3>
2415<a name="boost_xpressive.user_s_guide.accessing_results.h2"></a>
2416        <span class="phrase"><a name="boost_xpressive.user_s_guide.accessing_results.sub_match"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.accessing_results.sub_match">sub_match</a>
2417      </h3>
2418<p>
2419        When you index into a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2420        object, you get back a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2421        object. A <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2422        is basically a pair of iterators. It is defined like this:
2423      </p>
2424<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">BidirectionalIterator</span> <span class="special">&gt;</span>
2425<span class="keyword">struct</span> <span class="identifier">sub_match</span>
2426    <span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span> <span class="identifier">BidirectionalIterator</span><span class="special">,</span> <span class="identifier">BidirectionalIterator</span> <span class="special">&gt;</span>
2427<span class="special">{</span>
2428    <span class="keyword">bool</span> <span class="identifier">matched</span><span class="special">;</span>
2429    <span class="comment">// ...</span>
2430<span class="special">};</span>
2431</pre>
2432<p>
2433        Since it inherits publicaly from <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;&gt;</span></code>, <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2434        has <code class="computeroutput"><span class="identifier">first</span></code> and <code class="computeroutput"><span class="identifier">second</span></code> data members of type <code class="computeroutput"><span class="identifier">BidirectionalIterator</span></code>. These are the beginning
2435        and end of the sub-sequence this <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2436        represents. <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2437        also has a Boolean <code class="computeroutput"><span class="identifier">matched</span></code>
2438        data member, which is true if this <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2439        participated in the full match.
2440      </p>
2441<p>
2442        The following table shows how you might access the information stored in
2443        a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
2444        object called <code class="computeroutput"><span class="identifier">sub</span></code>.
2445      </p>
2446<div class="table">
2447<a name="boost_xpressive.user_s_guide.accessing_results.t1"></a><p class="title"><b>Table 46.6. sub_match&lt;&gt; Accessors</b></p>
2448<div class="table-contents"><table class="table" summary="sub_match&lt;&gt; Accessors">
2449<colgroup>
2450<col>
2451<col>
2452</colgroup>
2453<thead><tr>
2454<th>
2455                <p>
2456                  Accessor
2457                </p>
2458              </th>
2459<th>
2460                <p>
2461                  Effects
2462                </p>
2463              </th>
2464</tr></thead>
2465<tbody>
2466<tr>
2467<td>
2468                <p>
2469                  <code class="computeroutput"><span class="identifier">sub</span><span class="special">.</span><span class="identifier">length</span><span class="special">()</span></code>
2470                </p>
2471              </td>
2472<td>
2473                <p>
2474                  Returns the length of the sub-match. Same as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">sub</span><span class="special">.</span><span class="identifier">first</span><span class="special">,</span><span class="identifier">sub</span><span class="special">.</span><span class="identifier">second</span><span class="special">)</span></code>.
2475                </p>
2476              </td>
2477</tr>
2478<tr>
2479<td>
2480                <p>
2481                  <code class="computeroutput"><span class="identifier">sub</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span></code>
2482                </p>
2483              </td>
2484<td>
2485                <p>
2486                  Returns a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_string</span><span class="special">&lt;&gt;</span></code>
2487                  constructed from the sub-match. Same as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">char_type</span><span class="special">&gt;(</span><span class="identifier">sub</span><span class="special">.</span><span class="identifier">first</span><span class="special">,</span><span class="identifier">sub</span><span class="special">.</span><span class="identifier">second</span><span class="special">)</span></code>.
2488                </p>
2489              </td>
2490</tr>
2491<tr>
2492<td>
2493                <p>
2494                  <code class="computeroutput"><span class="identifier">sub</span><span class="special">.</span><span class="identifier">compare</span><span class="special">(</span><span class="identifier">str</span><span class="special">)</span></code>
2495                </p>
2496              </td>
2497<td>
2498                <p>
2499                  Performs a string comparison between the sub-match and <code class="computeroutput"><span class="identifier">str</span></code>, where <code class="computeroutput"><span class="identifier">str</span></code>
2500                  can be a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_string</span><span class="special">&lt;&gt;</span></code>,
2501                  C-style null-terminated string, or another sub-match. Same as
2502                  <code class="computeroutput"><span class="identifier">sub</span><span class="special">.</span><span class="identifier">str</span><span class="special">().</span><span class="identifier">compare</span><span class="special">(</span><span class="identifier">str</span><span class="special">)</span></code>.
2503                </p>
2504              </td>
2505</tr>
2506</tbody>
2507</table></div>
2508</div>
2509<br class="table-break"><h3>
2510<a name="boost_xpressive.user_s_guide.accessing_results.h3"></a>
2511        <span class="phrase"><a name="boost_xpressive.user_s_guide.accessing_results._inlinemediaobject__imageobject__imagedata_fileref__images_caution_png____imagedata___imageobject__textobject__phrase_caution__phrase___textobject___inlinemediaobject__results_invalidation__inlinemediaobject__imageobject__imagedata_fileref__images_caution_png____imagedata___imageobject__textobject__phrase_caution__phrase___textobject___inlinemediaobject_"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.accessing_results._inlinemediaobject__imageobject__imagedata_fileref__images_caution_png____imagedata___imageobject__textobject__phrase_caution__phrase___textobject___inlinemediaobject__results_invalidation__inlinemediaobject__imageobject__imagedata_fileref__images_caution_png____imagedata___imageobject__textobject__phrase_caution__phrase___textobject___inlinemediaobject_"><span class="inlinemediaobject"><img src="../images/caution.png" alt="caution"></span> Results Invalidation <span class="inlinemediaobject"><img src="../images/caution.png" alt="caution"></span></a>
2512      </h3>
2513<p>
2514        Results are stored as iterators into the input sequence. Anything which invalidates
2515        the input sequence will invalidate the match results. For instance, if you
2516        match a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> object, the results are only valid
2517        until your next call to a non-const member function of that <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
2518        object. After that, the results held by the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
2519        object are invalid. Don't use them!
2520      </p>
2521</div>
2522<div class="section">
2523<div class="titlepage"><div><div><h3 class="title">
2524<a name="boost_xpressive.user_s_guide.string_substitutions"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions" title="String Substitutions">String
2525      Substitutions</a>
2526</h3></div></div></div>
2527<p>
2528        Regular expressions are not only good for searching text; they're good at
2529        <span class="emphasis"><em>manipulating</em></span> it. And one of the most common text manipulation
2530        tasks is search-and-replace. xpressive provides the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
2531        algorithm for searching and replacing.
2532      </p>
2533<h3>
2534<a name="boost_xpressive.user_s_guide.string_substitutions.h0"></a>
2535        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.regex_replace__"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.regex_replace__">regex_replace()</a>
2536      </h3>
2537<p>
2538        Performing search-and-replace using <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
2539        is simple. All you need is an input sequence, a regex object, and a format
2540        string or a formatter object. There are several versions of the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
2541        algorithm. Some accept the input sequence as a bidirectional container such
2542        as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> and returns the result in a new
2543        container of the same type. Others accept the input as a null terminated
2544        string and return a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>. Still others accept the input sequence
2545        as a pair of iterators and writes the result into an output iterator. The
2546        substitution may be specified as a string with format sequences or as a formatter
2547        object. Below are some simple examples of using string-based substitutions.
2548      </p>
2549<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"This is his face"</span><span class="special">);</span>
2550<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">as_xpr</span><span class="special">(</span><span class="string">"his"</span><span class="special">);</span>                <span class="comment">// find all occurrences of "his" ...</span>
2551<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">format</span><span class="special">(</span><span class="string">"her"</span><span class="special">);</span>                <span class="comment">// ... and replace them with "her"</span>
2552
2553<span class="comment">// use the version of regex_replace() that operates on strings</span>
2554<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">output</span> <span class="special">=</span> <span class="identifier">regex_replace</span><span class="special">(</span> <span class="identifier">input</span><span class="special">,</span> <span class="identifier">re</span><span class="special">,</span> <span class="identifier">format</span> <span class="special">);</span>
2555<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">output</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
2556
2557<span class="comment">// use the version of regex_replace() that operates on iterators</span>
2558<span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span> <span class="keyword">char</span> <span class="special">&gt;</span> <span class="identifier">out_iter</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">);</span>
2559<span class="identifier">regex_replace</span><span class="special">(</span> <span class="identifier">out_iter</span><span class="special">,</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">re</span><span class="special">,</span> <span class="identifier">format</span> <span class="special">);</span>
2560</pre>
2561<p>
2562        The above program prints out the following:
2563      </p>
2564<pre class="programlisting">Ther is her face
2565Ther is her face
2566</pre>
2567<p>
2568        Notice that <span class="emphasis"><em>all</em></span> the occurrences of <code class="computeroutput"><span class="string">"his"</span></code>
2569        have been replaced with <code class="computeroutput"><span class="string">"her"</span></code>.
2570      </p>
2571<p>
2572        Click <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.replace_all_sub_strings_that_match_a_regex">here</a>
2573        to see a complete example program that shows how to use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>.
2574        And check the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
2575        reference to see a complete list of the available overloads.
2576      </p>
2577<h3>
2578<a name="boost_xpressive.user_s_guide.string_substitutions.h1"></a>
2579        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.replace_options"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.replace_options">Replace
2580        Options</a>
2581      </h3>
2582<p>
2583        The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
2584        algorithm takes an optional bitmask parameter to control the formatting.
2585        The possible values of the bitmask are:
2586      </p>
2587<div class="table">
2588<a name="boost_xpressive.user_s_guide.string_substitutions.t0"></a><p class="title"><b>Table 46.7. Format Flags</b></p>
2589<div class="table-contents"><table class="table" summary="Format Flags">
2590<colgroup>
2591<col>
2592<col>
2593</colgroup>
2594<thead><tr>
2595<th>
2596                <p>
2597                  Flag
2598                </p>
2599              </th>
2600<th>
2601                <p>
2602                  Meaning
2603                </p>
2604              </th>
2605</tr></thead>
2606<tbody>
2607<tr>
2608<td>
2609                <p>
2610                  <code class="computeroutput"><span class="identifier">format_default</span></code>
2611                </p>
2612              </td>
2613<td>
2614                <p>
2615                  Recognize the ECMA-262 format sequences (see below).
2616                </p>
2617              </td>
2618</tr>
2619<tr>
2620<td>
2621                <p>
2622                  <code class="computeroutput"><span class="identifier">format_first_only</span></code>
2623                </p>
2624              </td>
2625<td>
2626                <p>
2627                  Only replace the first match, not all of them.
2628                </p>
2629              </td>
2630</tr>
2631<tr>
2632<td>
2633                <p>
2634                  <code class="computeroutput"><span class="identifier">format_no_copy</span></code>
2635                </p>
2636              </td>
2637<td>
2638                <p>
2639                  Don't copy the parts of the input sequence that didn't match the
2640                  regex to the output sequence.
2641                </p>
2642              </td>
2643</tr>
2644<tr>
2645<td>
2646                <p>
2647                  <code class="computeroutput"><span class="identifier">format_literal</span></code>
2648                </p>
2649              </td>
2650<td>
2651                <p>
2652                  Treat the format string as a literal; that is, don't recognize
2653                  any escape sequences.
2654                </p>
2655              </td>
2656</tr>
2657<tr>
2658<td>
2659                <p>
2660                  <code class="computeroutput"><span class="identifier">format_perl</span></code>
2661                </p>
2662              </td>
2663<td>
2664                <p>
2665                  Recognize the Perl format sequences (see below).
2666                </p>
2667              </td>
2668</tr>
2669<tr>
2670<td>
2671                <p>
2672                  <code class="computeroutput"><span class="identifier">format_sed</span></code>
2673                </p>
2674              </td>
2675<td>
2676                <p>
2677                  Recognize the sed format sequences (see below).
2678                </p>
2679              </td>
2680</tr>
2681<tr>
2682<td>
2683                <p>
2684                  <code class="computeroutput"><span class="identifier">format_all</span></code>
2685                </p>
2686              </td>
2687<td>
2688                <p>
2689                  In addition to the Perl format sequences, recognize some Boost-specific
2690                  format sequences.
2691                </p>
2692              </td>
2693</tr>
2694</tbody>
2695</table></div>
2696</div>
2697<br class="table-break"><p>
2698        These flags live in the <code class="computeroutput"><span class="identifier">xpressive</span><span class="special">::</span><span class="identifier">regex_constants</span></code>
2699        namespace. If the substitution parameter is a function object instead of
2700        a string, the flags <code class="computeroutput"><span class="identifier">format_literal</span></code>,
2701        <code class="computeroutput"><span class="identifier">format_perl</span></code>, <code class="computeroutput"><span class="identifier">format_sed</span></code>, and <code class="computeroutput"><span class="identifier">format_all</span></code>
2702        are ignored.
2703      </p>
2704<h3>
2705<a name="boost_xpressive.user_s_guide.string_substitutions.h2"></a>
2706        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.the_ecma_262_format_sequences"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.the_ecma_262_format_sequences">The
2707        ECMA-262 Format Sequences</a>
2708      </h3>
2709<p>
2710        When you haven't specified a substitution string dialect with one of the
2711        format flags above, you get the dialect defined by ECMA-262, the standard
2712        for ECMAScript. The table below shows the escape sequences recognized in
2713        ECMA-262 mode.
2714      </p>
2715<div class="table">
2716<a name="boost_xpressive.user_s_guide.string_substitutions.t1"></a><p class="title"><b>Table 46.8. Format Escape Sequences</b></p>
2717<div class="table-contents"><table class="table" summary="Format Escape Sequences">
2718<colgroup>
2719<col>
2720<col>
2721</colgroup>
2722<thead><tr>
2723<th>
2724                <p>
2725                  Escape Sequence
2726                </p>
2727              </th>
2728<th>
2729                <p>
2730                  Meaning
2731                </p>
2732              </th>
2733</tr></thead>
2734<tbody>
2735<tr>
2736<td>
2737                <p>
2738                  <code class="literal">$1</code>, <code class="literal">$2</code>, etc.
2739                </p>
2740              </td>
2741<td>
2742                <p>
2743                  the corresponding sub-match
2744                </p>
2745              </td>
2746</tr>
2747<tr>
2748<td>
2749                <p>
2750                  <code class="literal">$&amp;</code>
2751                </p>
2752              </td>
2753<td>
2754                <p>
2755                  the full match
2756                </p>
2757              </td>
2758</tr>
2759<tr>
2760<td>
2761                <p>
2762                  <code class="literal">$`</code>
2763                </p>
2764              </td>
2765<td>
2766                <p>
2767                  the match prefix
2768                </p>
2769              </td>
2770</tr>
2771<tr>
2772<td>
2773                <p>
2774                  <code class="literal">$'</code>
2775                </p>
2776              </td>
2777<td>
2778                <p>
2779                  the match suffix
2780                </p>
2781              </td>
2782</tr>
2783<tr>
2784<td>
2785                <p>
2786                  <code class="literal">$$</code>
2787                </p>
2788              </td>
2789<td>
2790                <p>
2791                  a literal <code class="computeroutput"><span class="char">'$'</span></code> character
2792                </p>
2793              </td>
2794</tr>
2795</tbody>
2796</table></div>
2797</div>
2798<br class="table-break"><p>
2799        Any other sequence beginning with <code class="computeroutput"><span class="char">'$'</span></code>
2800        simply represents itself. For example, if the format string were <code class="computeroutput"><span class="string">"$a"</span></code> then <code class="computeroutput"><span class="string">"$a"</span></code>
2801        would be inserted into the output sequence.
2802      </p>
2803<h3>
2804<a name="boost_xpressive.user_s_guide.string_substitutions.h3"></a>
2805        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.the_sed_format_sequences"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.the_sed_format_sequences">The
2806        Sed Format Sequences</a>
2807      </h3>
2808<p>
2809        When specifying the <code class="computeroutput"><span class="identifier">format_sed</span></code>
2810        flag to <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>,
2811        the following escape sequences are recognized:
2812      </p>
2813<div class="table">
2814<a name="boost_xpressive.user_s_guide.string_substitutions.t2"></a><p class="title"><b>Table 46.9. Sed Format Escape Sequences</b></p>
2815<div class="table-contents"><table class="table" summary="Sed Format Escape Sequences">
2816<colgroup>
2817<col>
2818<col>
2819</colgroup>
2820<thead><tr>
2821<th>
2822                <p>
2823                  Escape Sequence
2824                </p>
2825              </th>
2826<th>
2827                <p>
2828                  Meaning
2829                </p>
2830              </th>
2831</tr></thead>
2832<tbody>
2833<tr>
2834<td>
2835                <p>
2836                  <code class="literal">\1</code>, <code class="literal">\2</code>, etc.
2837                </p>
2838              </td>
2839<td>
2840                <p>
2841                  The corresponding sub-match
2842                </p>
2843              </td>
2844</tr>
2845<tr>
2846<td>
2847                <p>
2848                  <code class="literal">&amp;</code>
2849                </p>
2850              </td>
2851<td>
2852                <p>
2853                  the full match
2854                </p>
2855              </td>
2856</tr>
2857<tr>
2858<td>
2859                <p>
2860                  <code class="literal">\a</code>
2861                </p>
2862              </td>
2863<td>
2864                <p>
2865                  A literal <code class="computeroutput"><span class="char">'\a'</span></code>
2866                </p>
2867              </td>
2868</tr>
2869<tr>
2870<td>
2871                <p>
2872                  <code class="literal">\e</code>
2873                </p>
2874              </td>
2875<td>
2876                <p>
2877                  A literal <code class="computeroutput"><span class="identifier">char_type</span><span class="special">(</span><span class="number">27</span><span class="special">)</span></code>
2878                </p>
2879              </td>
2880</tr>
2881<tr>
2882<td>
2883                <p>
2884                  <code class="literal">\f</code>
2885                </p>
2886              </td>
2887<td>
2888                <p>
2889                  A literal <code class="computeroutput"><span class="char">'\f'</span></code>
2890                </p>
2891              </td>
2892</tr>
2893<tr>
2894<td>
2895                <p>
2896                  <code class="literal">\n</code>
2897                </p>
2898              </td>
2899<td>
2900                <p>
2901                  A literal <code class="computeroutput"><span class="char">'\n'</span></code>
2902                </p>
2903              </td>
2904</tr>
2905<tr>
2906<td>
2907                <p>
2908                  <code class="literal">\r</code>
2909                </p>
2910              </td>
2911<td>
2912                <p>
2913                  A literal <code class="computeroutput"><span class="char">'\r'</span></code>
2914                </p>
2915              </td>
2916</tr>
2917<tr>
2918<td>
2919                <p>
2920                  <code class="literal">\t</code>
2921                </p>
2922              </td>
2923<td>
2924                <p>
2925                  A literal <code class="computeroutput"><span class="char">'\t'</span></code>
2926                </p>
2927              </td>
2928</tr>
2929<tr>
2930<td>
2931                <p>
2932                  <code class="literal">\v</code>
2933                </p>
2934              </td>
2935<td>
2936                <p>
2937                  A literal <code class="computeroutput"><span class="char">'\v'</span></code>
2938                </p>
2939              </td>
2940</tr>
2941<tr>
2942<td>
2943                <p>
2944                  <code class="literal">\xFF</code>
2945                </p>
2946              </td>
2947<td>
2948                <p>
2949                  A literal <code class="computeroutput"><span class="identifier">char_type</span><span class="special">(</span><span class="number">0xFF</span><span class="special">)</span></code>, where <code class="literal"><span class="emphasis"><em>F</em></span></code>
2950                  is any hex digit
2951                </p>
2952              </td>
2953</tr>
2954<tr>
2955<td>
2956                <p>
2957                  <code class="literal">\x{FFFF}</code>
2958                </p>
2959              </td>
2960<td>
2961                <p>
2962                  A literal <code class="computeroutput"><span class="identifier">char_type</span><span class="special">(</span><span class="number">0xFFFF</span><span class="special">)</span></code>, where <code class="literal"><span class="emphasis"><em>F</em></span></code>
2963                  is any hex digit
2964                </p>
2965              </td>
2966</tr>
2967<tr>
2968<td>
2969                <p>
2970                  <code class="literal">\cX</code>
2971                </p>
2972              </td>
2973<td>
2974                <p>
2975                  The control character <code class="literal"><span class="emphasis"><em>X</em></span></code>
2976                </p>
2977              </td>
2978</tr>
2979</tbody>
2980</table></div>
2981</div>
2982<br class="table-break"><h3>
2983<a name="boost_xpressive.user_s_guide.string_substitutions.h4"></a>
2984        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.the_perl_format_sequences"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.the_perl_format_sequences">The
2985        Perl Format Sequences</a>
2986      </h3>
2987<p>
2988        When specifying the <code class="computeroutput"><span class="identifier">format_perl</span></code>
2989        flag to <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>,
2990        the following escape sequences are recognized:
2991      </p>
2992<div class="table">
2993<a name="boost_xpressive.user_s_guide.string_substitutions.t3"></a><p class="title"><b>Table 46.10. Perl Format Escape Sequences</b></p>
2994<div class="table-contents"><table class="table" summary="Perl Format Escape Sequences">
2995<colgroup>
2996<col>
2997<col>
2998</colgroup>
2999<thead><tr>
3000<th>
3001                <p>
3002                  Escape Sequence
3003                </p>
3004              </th>
3005<th>
3006                <p>
3007                  Meaning
3008                </p>
3009              </th>
3010</tr></thead>
3011<tbody>
3012<tr>
3013<td>
3014                <p>
3015                  <code class="literal">$1</code>, <code class="literal">$2</code>, etc.
3016                </p>
3017              </td>
3018<td>
3019                <p>
3020                  the corresponding sub-match
3021                </p>
3022              </td>
3023</tr>
3024<tr>
3025<td>
3026                <p>
3027                  <code class="literal">$&amp;</code>
3028                </p>
3029              </td>
3030<td>
3031                <p>
3032                  the full match
3033                </p>
3034              </td>
3035</tr>
3036<tr>
3037<td>
3038                <p>
3039                  <code class="literal">$`</code>
3040                </p>
3041              </td>
3042<td>
3043                <p>
3044                  the match prefix
3045                </p>
3046              </td>
3047</tr>
3048<tr>
3049<td>
3050                <p>
3051                  <code class="literal">$'</code>
3052                </p>
3053              </td>
3054<td>
3055                <p>
3056                  the match suffix
3057                </p>
3058              </td>
3059</tr>
3060<tr>
3061<td>
3062                <p>
3063                  <code class="literal">$$</code>
3064                </p>
3065              </td>
3066<td>
3067                <p>
3068                  a literal <code class="computeroutput"><span class="char">'$'</span></code> character
3069                </p>
3070              </td>
3071</tr>
3072<tr>
3073<td>
3074                <p>
3075                  <code class="literal">\a</code>
3076                </p>
3077              </td>
3078<td>
3079                <p>
3080                  A literal <code class="computeroutput"><span class="char">'\a'</span></code>
3081                </p>
3082              </td>
3083</tr>
3084<tr>
3085<td>
3086                <p>
3087                  <code class="literal">\e</code>
3088                </p>
3089              </td>
3090<td>
3091                <p>
3092                  A literal <code class="computeroutput"><span class="identifier">char_type</span><span class="special">(</span><span class="number">27</span><span class="special">)</span></code>
3093                </p>
3094              </td>
3095</tr>
3096<tr>
3097<td>
3098                <p>
3099                  <code class="literal">\f</code>
3100                </p>
3101              </td>
3102<td>
3103                <p>
3104                  A literal <code class="computeroutput"><span class="char">'\f'</span></code>
3105                </p>
3106              </td>
3107</tr>
3108<tr>
3109<td>
3110                <p>
3111                  <code class="literal">\n</code>
3112                </p>
3113              </td>
3114<td>
3115                <p>
3116                  A literal <code class="computeroutput"><span class="char">'\n'</span></code>
3117                </p>
3118              </td>
3119</tr>
3120<tr>
3121<td>
3122                <p>
3123                  <code class="literal">\r</code>
3124                </p>
3125              </td>
3126<td>
3127                <p>
3128                  A literal <code class="computeroutput"><span class="char">'\r'</span></code>
3129                </p>
3130              </td>
3131</tr>
3132<tr>
3133<td>
3134                <p>
3135                  <code class="literal">\t</code>
3136                </p>
3137              </td>
3138<td>
3139                <p>
3140                  A literal <code class="computeroutput"><span class="char">'\t'</span></code>
3141                </p>
3142              </td>
3143</tr>
3144<tr>
3145<td>
3146                <p>
3147                  <code class="literal">\v</code>
3148                </p>
3149              </td>
3150<td>
3151                <p>
3152                  A literal <code class="computeroutput"><span class="char">'\v'</span></code>
3153                </p>
3154              </td>
3155</tr>
3156<tr>
3157<td>
3158                <p>
3159                  <code class="literal">\xFF</code>
3160                </p>
3161              </td>
3162<td>
3163                <p>
3164                  A literal <code class="computeroutput"><span class="identifier">char_type</span><span class="special">(</span><span class="number">0xFF</span><span class="special">)</span></code>, where <code class="literal"><span class="emphasis"><em>F</em></span></code>
3165                  is any hex digit
3166                </p>
3167              </td>
3168</tr>
3169<tr>
3170<td>
3171                <p>
3172                  <code class="literal">\x{FFFF}</code>
3173                </p>
3174              </td>
3175<td>
3176                <p>
3177                  A literal <code class="computeroutput"><span class="identifier">char_type</span><span class="special">(</span><span class="number">0xFFFF</span><span class="special">)</span></code>, where <code class="literal"><span class="emphasis"><em>F</em></span></code>
3178                  is any hex digit
3179                </p>
3180              </td>
3181</tr>
3182<tr>
3183<td>
3184                <p>
3185                  <code class="literal">\cX</code>
3186                </p>
3187              </td>
3188<td>
3189                <p>
3190                  The control character <code class="literal"><span class="emphasis"><em>X</em></span></code>
3191                </p>
3192              </td>
3193</tr>
3194<tr>
3195<td>
3196                <p>
3197                  <code class="literal">\l</code>
3198                </p>
3199              </td>
3200<td>
3201                <p>
3202                  Make the next character lowercase
3203                </p>
3204              </td>
3205</tr>
3206<tr>
3207<td>
3208                <p>
3209                  <code class="literal">\L</code>
3210                </p>
3211              </td>
3212<td>
3213                <p>
3214                  Make the rest of the substitution lowercase until the next <code class="literal">\E</code>
3215                </p>
3216              </td>
3217</tr>
3218<tr>
3219<td>
3220                <p>
3221                  <code class="literal">\u</code>
3222                </p>
3223              </td>
3224<td>
3225                <p>
3226                  Make the next character uppercase
3227                </p>
3228              </td>
3229</tr>
3230<tr>
3231<td>
3232                <p>
3233                  <code class="literal">\U</code>
3234                </p>
3235              </td>
3236<td>
3237                <p>
3238                  Make the rest of the substitution uppercase until the next <code class="literal">\E</code>
3239                </p>
3240              </td>
3241</tr>
3242<tr>
3243<td>
3244                <p>
3245                  <code class="literal">\E</code>
3246                </p>
3247              </td>
3248<td>
3249                <p>
3250                  Terminate <code class="literal">\L</code> or <code class="literal">\U</code>
3251                </p>
3252              </td>
3253</tr>
3254<tr>
3255<td>
3256                <p>
3257                  <code class="literal">\1</code>, <code class="literal">\2</code>, etc.
3258                </p>
3259              </td>
3260<td>
3261                <p>
3262                  The corresponding sub-match
3263                </p>
3264              </td>
3265</tr>
3266<tr>
3267<td>
3268                <p>
3269                  <code class="literal">\g&lt;name&gt;</code>
3270                </p>
3271              </td>
3272<td>
3273                <p>
3274                  The named backref <span class="emphasis"><em>name</em></span>
3275                </p>
3276              </td>
3277</tr>
3278</tbody>
3279</table></div>
3280</div>
3281<br class="table-break"><h3>
3282<a name="boost_xpressive.user_s_guide.string_substitutions.h5"></a>
3283        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.the_boost_specific_format_sequences"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.the_boost_specific_format_sequences">The
3284        Boost-Specific Format Sequences</a>
3285      </h3>
3286<p>
3287        When specifying the <code class="computeroutput"><span class="identifier">format_all</span></code>
3288        flag to <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>,
3289        the escape sequences recognized are the same as those above for <code class="computeroutput"><span class="identifier">format_perl</span></code>. In addition, conditional expressions
3290        of the following form are recognized:
3291      </p>
3292<pre class="programlisting">?Ntrue-expression:false-expression
3293</pre>
3294<p>
3295        where <span class="emphasis"><em>N</em></span> is a decimal digit representing a sub-match.
3296        If the corresponding sub-match participated in the full match, then the substitution
3297        is <span class="emphasis"><em>true-expression</em></span>. Otherwise, it is <span class="emphasis"><em>false-expression</em></span>.
3298        In this mode, you can use parens <code class="literal">()</code> for grouping. If you
3299        want a literal paren, you must escape it as <code class="literal">\(</code>.
3300      </p>
3301<h3>
3302<a name="boost_xpressive.user_s_guide.string_substitutions.h6"></a>
3303        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.formatter_objects"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.formatter_objects">Formatter
3304        Objects</a>
3305      </h3>
3306<p>
3307        Format strings are not always expressive enough for all your text substitution
3308        needs. Consider the simple example of wanting to map input strings to output
3309        strings, as you may want to do with environment variables. Rather than a
3310        format <span class="emphasis"><em>string</em></span>, for this you would use a formatter <span class="emphasis"><em>object</em></span>.
3311        Consider the following code, which finds embedded environment variables of
3312        the form <code class="computeroutput"><span class="string">"$(XYZ)"</span></code> and
3313        computes the substitution string by looking up the environment variable in
3314        a map.
3315      </p>
3316<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">map</span><span class="special">&gt;</span>
3317<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
3318<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
3319<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3320<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
3321<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">xpressive</span><span class="special">;</span>
3322
3323<span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">env</span><span class="special">;</span>
3324
3325<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">format_fun</span><span class="special">(</span><span class="identifier">smatch</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">what</span><span class="special">)</span>
3326<span class="special">{</span>
3327    <span class="keyword">return</span> <span class="identifier">env</span><span class="special">[</span><span class="identifier">what</span><span class="special">[</span><span class="number">1</span><span class="special">].</span><span class="identifier">str</span><span class="special">()];</span>
3328<span class="special">}</span>
3329
3330<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
3331<span class="special">{</span>
3332    <span class="identifier">env</span><span class="special">[</span><span class="string">"X"</span><span class="special">]</span> <span class="special">=</span> <span class="string">"this"</span><span class="special">;</span>
3333    <span class="identifier">env</span><span class="special">[</span><span class="string">"Y"</span><span class="special">]</span> <span class="special">=</span> <span class="string">"that"</span><span class="special">;</span>
3334
3335    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"\"$(X)\" has the value \"$(Y)\""</span><span class="special">);</span>
3336
3337    <span class="comment">// replace strings like "$(XYZ)" with the result of env["XYZ"]</span>
3338    <span class="identifier">sregex</span> <span class="identifier">envar</span> <span class="special">=</span> <span class="string">"$("</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s1</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">')'</span><span class="special">;</span>
3339    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">output</span> <span class="special">=</span> <span class="identifier">regex_replace</span><span class="special">(</span><span class="identifier">input</span><span class="special">,</span> <span class="identifier">envar</span><span class="special">,</span> <span class="identifier">format_fun</span><span class="special">);</span>
3340    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">output</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
3341<span class="special">}</span>
3342</pre>
3343<p>
3344        In this case, we use a function, <code class="computeroutput"><span class="identifier">format_fun</span><span class="special">()</span></code> to compute the substitution string on the
3345        fly. It accepts a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
3346        object which contains the results of the current match. <code class="computeroutput"><span class="identifier">format_fun</span><span class="special">()</span></code> uses the first submatch as a key into the
3347        global <code class="computeroutput"><span class="identifier">env</span></code> map. The above
3348        code displays:
3349      </p>
3350<pre class="programlisting">"this" has the value "that"
3351</pre>
3352<p>
3353        The formatter need not be an ordinary function. It may be an object of class
3354        type. And rather than return a string, it may accept an output iterator into
3355        which it writes the substitution. Consider the following, which is functionally
3356        equivalent to the above.
3357      </p>
3358<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">map</span><span class="special">&gt;</span>
3359<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
3360<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
3361<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3362<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
3363<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">xpressive</span><span class="special">;</span>
3364
3365<span class="keyword">struct</span> <span class="identifier">formatter</span>
3366<span class="special">{</span>
3367    <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">env_map</span><span class="special">;</span>
3368    <span class="identifier">env_map</span> <span class="identifier">env</span><span class="special">;</span>
3369
3370    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Out</span><span class="special">&gt;</span>
3371    <span class="identifier">Out</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">smatch</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">what</span><span class="special">,</span> <span class="identifier">Out</span> <span class="identifier">out</span><span class="special">)</span> <span class="keyword">const</span>
3372    <span class="special">{</span>
3373        <span class="identifier">env_map</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">where</span> <span class="special">=</span> <span class="identifier">env</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">what</span><span class="special">[</span><span class="number">1</span><span class="special">]);</span>
3374        <span class="keyword">if</span><span class="special">(</span><span class="identifier">where</span> <span class="special">!=</span> <span class="identifier">env</span><span class="special">.</span><span class="identifier">end</span><span class="special">())</span>
3375        <span class="special">{</span>
3376            <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">sub</span> <span class="special">=</span> <span class="identifier">where</span><span class="special">-&gt;</span><span class="identifier">second</span><span class="special">;</span>
3377            <span class="identifier">out</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">sub</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">sub</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">out</span><span class="special">);</span>
3378        <span class="special">}</span>
3379        <span class="keyword">return</span> <span class="identifier">out</span><span class="special">;</span>
3380    <span class="special">}</span>
3381
3382<span class="special">};</span>
3383
3384<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
3385<span class="special">{</span>
3386    <span class="identifier">formatter</span> <span class="identifier">fmt</span><span class="special">;</span>
3387    <span class="identifier">fmt</span><span class="special">.</span><span class="identifier">env</span><span class="special">[</span><span class="string">"X"</span><span class="special">]</span> <span class="special">=</span> <span class="string">"this"</span><span class="special">;</span>
3388    <span class="identifier">fmt</span><span class="special">.</span><span class="identifier">env</span><span class="special">[</span><span class="string">"Y"</span><span class="special">]</span> <span class="special">=</span> <span class="string">"that"</span><span class="special">;</span>
3389
3390    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"\"$(X)\" has the value \"$(Y)\""</span><span class="special">);</span>
3391
3392    <span class="identifier">sregex</span> <span class="identifier">envar</span> <span class="special">=</span> <span class="string">"$("</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s1</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">')'</span><span class="special">;</span>
3393    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">output</span> <span class="special">=</span> <span class="identifier">regex_replace</span><span class="special">(</span><span class="identifier">input</span><span class="special">,</span> <span class="identifier">envar</span><span class="special">,</span> <span class="identifier">fmt</span><span class="special">);</span>
3394    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">output</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
3395<span class="special">}</span>
3396</pre>
3397<p>
3398        The formatter must be a callable object -- a function or a function object
3399        -- that has one of three possible signatures, detailed in the table below.
3400        For the table, <code class="computeroutput"><span class="identifier">fmt</span></code> is a function
3401        pointer or function object, <code class="computeroutput"><span class="identifier">what</span></code>
3402        is a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
3403        object, <code class="computeroutput"><span class="identifier">out</span></code> is an OutputIterator,
3404        and <code class="computeroutput"><span class="identifier">flags</span></code> is a value of
3405        <code class="computeroutput"><span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">match_flag_type</span></code>:
3406      </p>
3407<div class="table">
3408<a name="boost_xpressive.user_s_guide.string_substitutions.t4"></a><p class="title"><b>Table 46.11. Formatter Signatures</b></p>
3409<div class="table-contents"><table class="table" summary="Formatter Signatures">
3410<colgroup>
3411<col>
3412<col>
3413<col>
3414</colgroup>
3415<thead><tr>
3416<th>
3417                <p>
3418                  Formatter Invocation
3419                </p>
3420              </th>
3421<th>
3422                <p>
3423                  Return Type
3424                </p>
3425              </th>
3426<th>
3427                <p>
3428                  Semantics
3429                </p>
3430              </th>
3431</tr></thead>
3432<tbody>
3433<tr>
3434<td>
3435                <p>
3436                  <code class="computeroutput"><span class="identifier">fmt</span><span class="special">(</span><span class="identifier">what</span><span class="special">)</span></code>
3437                </p>
3438              </td>
3439<td>
3440                <p>
3441                  Range of characters (e.g. <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>)
3442                  or null-terminated string
3443                </p>
3444              </td>
3445<td>
3446                <p>
3447                  The string matched by the regex is replaced with the string returned
3448                  by the formatter.
3449                </p>
3450              </td>
3451</tr>
3452<tr>
3453<td>
3454                <p>
3455                  <code class="computeroutput"><span class="identifier">fmt</span><span class="special">(</span><span class="identifier">what</span><span class="special">,</span>
3456                  <span class="identifier">out</span><span class="special">)</span></code>
3457                </p>
3458              </td>
3459<td>
3460                <p>
3461                  OutputIterator
3462                </p>
3463              </td>
3464<td>
3465                <p>
3466                  The formatter writes the replacement string into <code class="computeroutput"><span class="identifier">out</span></code> and returns <code class="computeroutput"><span class="identifier">out</span></code>.
3467                </p>
3468              </td>
3469</tr>
3470<tr>
3471<td>
3472                <p>
3473                  <code class="computeroutput"><span class="identifier">fmt</span><span class="special">(</span><span class="identifier">what</span><span class="special">,</span>
3474                  <span class="identifier">out</span><span class="special">,</span>
3475                  <span class="identifier">flags</span><span class="special">)</span></code>
3476                </p>
3477              </td>
3478<td>
3479                <p>
3480                  OutputIterator
3481                </p>
3482              </td>
3483<td>
3484                <p>
3485                  The formatter writes the replacement string into <code class="computeroutput"><span class="identifier">out</span></code> and returns <code class="computeroutput"><span class="identifier">out</span></code>. The <code class="computeroutput"><span class="identifier">flags</span></code>
3486                  parameter is the value of the match flags passed to the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
3487                  algorithm.
3488                </p>
3489              </td>
3490</tr>
3491</tbody>
3492</table></div>
3493</div>
3494<br class="table-break"><h3>
3495<a name="boost_xpressive.user_s_guide.string_substitutions.h7"></a>
3496        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_substitutions.formatter_expressions"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions.formatter_expressions">Formatter
3497        Expressions</a>
3498      </h3>
3499<p>
3500        In addition to format <span class="emphasis"><em>strings</em></span> and formatter <span class="emphasis"><em>objects</em></span>,
3501        <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
3502        also accepts formatter <span class="emphasis"><em>expressions</em></span>. A formatter expression
3503        is a lambda expression that generates a string. It uses the same syntax as
3504        that for <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions" title="Semantic Actions and User-Defined Assertions">Semantic
3505        Actions</a>, which are covered later. The above example, which uses <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>
3506        to substitute strings for environment variables, is repeated here using a
3507        formatter expression.
3508      </p>
3509<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">map</span><span class="special">&gt;</span>
3510<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
3511<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
3512<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3513<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">regex_actions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3514<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
3515
3516<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
3517<span class="special">{</span>
3518    <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">env</span><span class="special">;</span>
3519    <span class="identifier">env</span><span class="special">[</span><span class="string">"X"</span><span class="special">]</span> <span class="special">=</span> <span class="string">"this"</span><span class="special">;</span>
3520    <span class="identifier">env</span><span class="special">[</span><span class="string">"Y"</span><span class="special">]</span> <span class="special">=</span> <span class="string">"that"</span><span class="special">;</span>
3521
3522    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"\"$(X)\" has the value \"$(Y)\""</span><span class="special">);</span>
3523
3524    <span class="identifier">sregex</span> <span class="identifier">envar</span> <span class="special">=</span> <span class="string">"$("</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s1</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">')'</span><span class="special">;</span>
3525    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">output</span> <span class="special">=</span> <span class="identifier">regex_replace</span><span class="special">(</span><span class="identifier">input</span><span class="special">,</span> <span class="identifier">envar</span><span class="special">,</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">env</span><span class="special">)[</span><span class="identifier">s1</span><span class="special">]);</span>
3526    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">output</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
3527<span class="special">}</span>
3528</pre>
3529<p>
3530        In the above, the formatter expression is <code class="computeroutput"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">env</span><span class="special">)[</span><span class="identifier">s1</span><span class="special">]</span></code>. This
3531        means to use the value of the first submatch, <code class="computeroutput"><span class="identifier">s1</span></code>,
3532        as a key into the <code class="computeroutput"><span class="identifier">env</span></code> map.
3533        The purpose of <code class="computeroutput"><span class="identifier">xpressive</span><span class="special">::</span><span class="identifier">ref</span><span class="special">()</span></code>
3534        here is to make the reference to the <code class="computeroutput"><span class="identifier">env</span></code>
3535        local variable <span class="emphasis"><em>lazy</em></span> so that the index operation is deferred
3536        until we know what to replace <code class="computeroutput"><span class="identifier">s1</span></code>
3537        with.
3538      </p>
3539</div>
3540<div class="section">
3541<div class="titlepage"><div><div><h3 class="title">
3542<a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_splitting_and_tokenization" title="String Splitting and Tokenization">String
3543      Splitting and Tokenization</a>
3544</h3></div></div></div>
3545<p>
3546        <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3547        is the Ginsu knife of the text manipulation world. It slices! It dices! This
3548        section describes how to use the highly-configurable <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3549        to chop up input sequences.
3550      </p>
3551<h3>
3552<a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.h0"></a>
3553        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_splitting_and_tokenization.overview">Overview</a>
3554      </h3>
3555<p>
3556        You initialize a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3557        with an input sequence, a regex, and some optional configuration parameters.
3558        The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3559        will use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
3560        to find the first place in the sequence that the regex matches. When dereferenced,
3561        the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3562        returns a <span class="emphasis"><em>token</em></span> in the form of a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_string</span><span class="special">&lt;&gt;</span></code>. Which string it returns depends
3563        on the configuration parameters. By default it returns a string corresponding
3564        to the full match, but it could also return a string corresponding to a particular
3565        marked sub-expression, or even the part of the sequence that <span class="emphasis"><em>didn't</em></span>
3566        match. When you increment the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>,
3567        it will move to the next token. Which token is next depends on the configuration
3568        parameters. It could simply be a different marked sub-expression in the current
3569        match, or it could be part or all of the next match. Or it could be the part
3570        that <span class="emphasis"><em>didn't</em></span> match.
3571      </p>
3572<p>
3573        As you can see, <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3574        can do a lot. That makes it hard to describe, but some examples should make
3575        it clear.
3576      </p>
3577<h3>
3578<a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.h1"></a>
3579        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_1__simple_tokenization"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_1__simple_tokenization">Example
3580        1: Simple Tokenization</a>
3581      </h3>
3582<p>
3583        This example uses <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3584        to chop a sequence into a series of tokens consisting of words.
3585      </p>
3586<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"This is his face"</span><span class="special">);</span>
3587<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">;</span>                      <span class="comment">// find a word</span>
3588
3589<span class="comment">// iterate over all the words in the input</span>
3590<span class="identifier">sregex_token_iterator</span> <span class="identifier">begin</span><span class="special">(</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">re</span> <span class="special">),</span> <span class="identifier">end</span><span class="special">;</span>
3591
3592<span class="comment">// write all the words to std::cout</span>
3593<span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;</span> <span class="identifier">out_iter</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">"\n"</span> <span class="special">);</span>
3594<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">out_iter</span> <span class="special">);</span>
3595</pre>
3596<p>
3597        This program displays the following:
3598      </p>
3599<pre class="programlisting">This
3600is
3601his
3602face
3603</pre>
3604<h3>
3605<a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.h2"></a>
3606        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_2__simple_tokenization__reloaded"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_2__simple_tokenization__reloaded">Example
3607        2: Simple Tokenization, Reloaded</a>
3608      </h3>
3609<p>
3610        This example also uses <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3611        to chop a sequence into a series of tokens consisting of words, but it uses
3612        the regex as a delimiter. When we pass a <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code> as the last parameter to the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3613        constructor, it instructs the token iterator to consider as tokens those
3614        parts of the input that <span class="emphasis"><em>didn't</em></span> match the regex.
3615      </p>
3616<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"This is his face"</span><span class="special">);</span>
3617<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_s</span><span class="special">;</span>                      <span class="comment">// find white space</span>
3618
3619<span class="comment">// iterate over all non-white space in the input. Note the -1 below:</span>
3620<span class="identifier">sregex_token_iterator</span> <span class="identifier">begin</span><span class="special">(</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">re</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span> <span class="special">),</span> <span class="identifier">end</span><span class="special">;</span>
3621
3622<span class="comment">// write all the words to std::cout</span>
3623<span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;</span> <span class="identifier">out_iter</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">"\n"</span> <span class="special">);</span>
3624<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">out_iter</span> <span class="special">);</span>
3625</pre>
3626<p>
3627        This program displays the following:
3628      </p>
3629<pre class="programlisting">This
3630is
3631his
3632face
3633</pre>
3634<h3>
3635<a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.h3"></a>
3636        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_3__simple_tokenization__revolutions"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_3__simple_tokenization__revolutions">Example
3637        3: Simple Tokenization, Revolutions</a>
3638      </h3>
3639<p>
3640        This example also uses <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3641        to chop a sequence containing a bunch of dates into a series of tokens consisting
3642        of just the years. When we pass a positive integer <code class="literal"><span class="emphasis"><em>N</em></span></code>
3643        as the last parameter to the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3644        constructor, it instructs the token iterator to consider as tokens only the
3645        <code class="literal"><span class="emphasis"><em>N</em></span></code>-th marked sub-expression of each
3646        match.
3647      </p>
3648<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"01/02/2003 blahblah 04/23/1999 blahblah 11/13/1981"</span><span class="special">);</span>
3649<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(\\d{2})/(\\d{2})/(\\d{4})"</span><span class="special">);</span> <span class="comment">// find a date</span>
3650
3651<span class="comment">// iterate over all the years in the input. Note the 3 below, corresponding to the 3rd sub-expression:</span>
3652<span class="identifier">sregex_token_iterator</span> <span class="identifier">begin</span><span class="special">(</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">re</span><span class="special">,</span> <span class="number">3</span> <span class="special">),</span> <span class="identifier">end</span><span class="special">;</span>
3653
3654<span class="comment">// write all the words to std::cout</span>
3655<span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;</span> <span class="identifier">out_iter</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">"\n"</span> <span class="special">);</span>
3656<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">out_iter</span> <span class="special">);</span>
3657</pre>
3658<p>
3659        This program displays the following:
3660      </p>
3661<pre class="programlisting">2003
36621999
36631981
3664</pre>
3665<h3>
3666<a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.h4"></a>
3667        <span class="phrase"><a name="boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_4__not_so_simple_tokenization"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.string_splitting_and_tokenization.example_4__not_so_simple_tokenization">Example
3668        4: Not-So-Simple Tokenization</a>
3669      </h3>
3670<p>
3671        This example is like the previous one, except that instead of tokenizing
3672        just the years, this program turns the days, months and years into tokens.
3673        When we pass an array of integers <code class="literal"><span class="emphasis"><em>{I,J,...}</em></span></code>
3674        as the last parameter to the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3675        constructor, it instructs the token iterator to consider as tokens the <code class="literal"><span class="emphasis"><em>I</em></span></code>-th,
3676        <code class="literal"><span class="emphasis"><em>J</em></span></code>-th, etc. marked sub-expression
3677        of each match.
3678      </p>
3679<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">(</span><span class="string">"01/02/2003 blahblah 04/23/1999 blahblah 11/13/1981"</span><span class="special">);</span>
3680<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(\\d{2})/(\\d{2})/(\\d{4})"</span><span class="special">);</span> <span class="comment">// find a date</span>
3681
3682<span class="comment">// iterate over the days, months and years in the input</span>
3683<span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">sub_matches</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">2</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">3</span> <span class="special">};</span> <span class="comment">// day, month, year</span>
3684<span class="identifier">sregex_token_iterator</span> <span class="identifier">begin</span><span class="special">(</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">input</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">re</span><span class="special">,</span> <span class="identifier">sub_matches</span> <span class="special">),</span> <span class="identifier">end</span><span class="special">;</span>
3685
3686<span class="comment">// write all the words to std::cout</span>
3687<span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;</span> <span class="identifier">out_iter</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">,</span> <span class="string">"\n"</span> <span class="special">);</span>
3688<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">out_iter</span> <span class="special">);</span>
3689</pre>
3690<p>
3691        This program displays the following:
3692      </p>
3693<pre class="programlisting">02
369401
36952003
369623
369704
36981999
369913
370011
37011981
3702</pre>
3703<p>
3704        The <code class="computeroutput"><span class="identifier">sub_matches</span></code> array instructs
3705        the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
3706        to first take the value of the 2nd sub-match, then the 1st sub-match, and
3707        finally the 3rd. Incrementing the iterator again instructs it to use <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
3708        again to find the next match. At that point, the process repeats -- the token
3709        iterator takes the value of the 2nd sub-match, then the 1st, et cetera.
3710      </p>
3711</div>
3712<div class="section">
3713<div class="titlepage"><div><div><h3 class="title">
3714<a name="boost_xpressive.user_s_guide.named_captures"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.named_captures" title="Named Captures">Named Captures</a>
3715</h3></div></div></div>
3716<h3>
3717<a name="boost_xpressive.user_s_guide.named_captures.h0"></a>
3718        <span class="phrase"><a name="boost_xpressive.user_s_guide.named_captures.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.named_captures.overview">Overview</a>
3719      </h3>
3720<p>
3721        For complicated regular expressions, dealing with numbered captures can be
3722        a pain. Counting left parentheses to figure out which capture to reference
3723        is no fun. Less fun is the fact that merely editing a regular expression
3724        could cause a capture to be assigned a new number, invaliding code that refers
3725        back to it by the old number.
3726      </p>
3727<p>
3728        Other regular expression engines solve this problem with a feature called
3729        <span class="emphasis"><em>named captures</em></span>. This feature allows you to assign a
3730        name to a capture, and to refer back to the capture by name rather by number.
3731        Xpressive also supports named captures, both in dynamic and in static regexes.
3732      </p>
3733<h3>
3734<a name="boost_xpressive.user_s_guide.named_captures.h1"></a>
3735        <span class="phrase"><a name="boost_xpressive.user_s_guide.named_captures.dynamic_named_captures"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.named_captures.dynamic_named_captures">Dynamic
3736        Named Captures</a>
3737      </h3>
3738<p>
3739        For dynamic regular expressions, xpressive follows the lead of other popular
3740        regex engines with the syntax of named captures. You can create a named capture
3741        with <code class="computeroutput"><span class="string">"(?P&lt;xxx&gt;...)"</span></code>
3742        and refer back to that capture with <code class="computeroutput"><span class="string">"(?P=xxx)"</span></code>.
3743        Here, for instance, is a regular expression that creates a named capture
3744        and refers back to it:
3745      </p>
3746<pre class="programlisting"><span class="comment">// Create a named capture called "char" that matches a single</span>
3747<span class="comment">// character and refer back to that capture by name.</span>
3748<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(?P&lt;char&gt;.)(?P=char)"</span><span class="special">);</span>
3749</pre>
3750<p>
3751        The effect of the above regular expression is to find the first doubled character.
3752      </p>
3753<p>
3754        Once you have executed a match or search operation using a regex with named
3755        captures, you can access the named capture through the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
3756        object using the capture's name.
3757      </p>
3758<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"tweet"</span><span class="special">);</span>
3759<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(?P&lt;char&gt;.)(?P=char)"</span><span class="special">);</span>
3760<span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
3761<span class="keyword">if</span><span class="special">(</span><span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">))</span>
3762<span class="special">{</span>
3763    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"char = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="string">"char"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
3764<span class="special">}</span>
3765</pre>
3766<p>
3767        The above code displays:
3768      </p>
3769<pre class="programlisting">char = e
3770</pre>
3771<p>
3772        You can also refer back to a named capture from within a substitution string.
3773        The syntax for that is <code class="computeroutput"><span class="string">"\\g&lt;xxx&gt;"</span></code>.
3774        Below is some code that demonstrates how to use named captures when doing
3775        string substitution.
3776      </p>
3777<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"tweet"</span><span class="special">);</span>
3778<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(?P&lt;char&gt;.)(?P=char)"</span><span class="special">);</span>
3779<span class="identifier">str</span> <span class="special">=</span> <span class="identifier">regex_replace</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">,</span> <span class="string">"**\\g&lt;char&gt;**"</span><span class="special">,</span> <span class="identifier">regex_constants</span><span class="special">::</span><span class="identifier">format_perl</span><span class="special">);</span>
3780<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">str</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
3781</pre>
3782<p>
3783        Notice that you have to specify <code class="computeroutput"><span class="identifier">format_perl</span></code>
3784        when using named captures. Only the perl syntax recognizes the <code class="computeroutput"><span class="string">"\\g&lt;xxx&gt;"</span></code> syntax. The above
3785        code displays:
3786      </p>
3787<pre class="programlisting">tw**e**t
3788</pre>
3789<h3>
3790<a name="boost_xpressive.user_s_guide.named_captures.h2"></a>
3791        <span class="phrase"><a name="boost_xpressive.user_s_guide.named_captures.static_named_captures"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.named_captures.static_named_captures">Static
3792        Named Captures</a>
3793      </h3>
3794<p>
3795        If you're using static regular expressions, creating and using named captures
3796        is even easier. You can use the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/mark_tag.html" title="Struct mark_tag">mark_tag</a></code></code>
3797        type to create a variable that you can use like <code class="computeroutput"><a class="link" href="../boost/xpressive/s1.html" title="Global s1">s1</a></code>, <code class="computeroutput"><a class="link" href="../boost/xpressive/s1.html" title="Global s1">s2</a></code> and friends, but with a
3798        name that is more meaningful. Below is how the above example would look using
3799        static regexes:
3800      </p>
3801<pre class="programlisting"><span class="identifier">mark_tag</span> <span class="identifier">char_</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> <span class="comment">// char_ is now a synonym for s1</span>
3802<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">char_</span><span class="special">=</span> <span class="identifier">_</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="identifier">char_</span><span class="special">;</span>
3803</pre>
3804<p>
3805        After a match operation, you can use the <code class="computeroutput"><span class="identifier">mark_tag</span></code>
3806        to index into the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
3807        to access the named capture:
3808      </p>
3809<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"tweet"</span><span class="special">);</span>
3810<span class="identifier">mark_tag</span> <span class="identifier">char_</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
3811<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">char_</span><span class="special">=</span> <span class="identifier">_</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="identifier">char_</span><span class="special">;</span>
3812<span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
3813<span class="keyword">if</span><span class="special">(</span><span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">))</span>
3814<span class="special">{</span>
3815    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="identifier">char_</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
3816<span class="special">}</span>
3817</pre>
3818<p>
3819        The above code displays:
3820      </p>
3821<pre class="programlisting">char = e
3822</pre>
3823<p>
3824        When doing string substitutions with <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_replace.html" title="Function regex_replace">regex_replace()</a></code></code>,
3825        you can use named captures to create <span class="emphasis"><em>format expressions</em></span>
3826        as below:
3827      </p>
3828<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"tweet"</span><span class="special">);</span>
3829<span class="identifier">mark_tag</span> <span class="identifier">char_</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
3830<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">char_</span><span class="special">=</span> <span class="identifier">_</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="identifier">char_</span><span class="special">;</span>
3831<span class="identifier">str</span> <span class="special">=</span> <span class="identifier">regex_replace</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">,</span> <span class="string">"**"</span> <span class="special">+</span> <span class="identifier">char_</span> <span class="special">+</span> <span class="string">"**"</span><span class="special">);</span>
3832<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">str</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
3833</pre>
3834<p>
3835        The above code displays:
3836      </p>
3837<pre class="programlisting">tw**e**t
3838</pre>
3839<div class="note"><table border="0" summary="Note">
3840<tr>
3841<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
3842<th align="left">Note</th>
3843</tr>
3844<tr><td align="left" valign="top"><p>
3845          You need to include <code class="literal">&lt;boost/xpressive/regex_actions.hpp&gt;</code>
3846          to use format expressions.
3847        </p></td></tr>
3848</table></div>
3849</div>
3850<div class="section">
3851<div class="titlepage"><div><div><h3 class="title">
3852<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches" title="Grammars and Nested Matches">Grammars
3853      and Nested Matches</a>
3854</h3></div></div></div>
3855<h3>
3856<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h0"></a>
3857        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.overview">Overview</a>
3858      </h3>
3859<p>
3860        One of the key benefits of representing regexes as C++ expressions is the
3861        ability to easily refer to other C++ code and data from within the regex.
3862        This enables programming idioms that are not possible with other regular
3863        expression libraries. Of particular note is the ability for one regex to
3864        refer to another regex, allowing you to build grammars out of regular expressions.
3865        This section describes how to embed one regex in another by value and by
3866        reference, how regex objects behave when they refer to other regexes, and
3867        how to access the tree of results after a successful parse.
3868      </p>
3869<h3>
3870<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h1"></a>
3871        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.embedding_a_regex_by_value"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.embedding_a_regex_by_value">Embedding
3872        a Regex by Value</a>
3873      </h3>
3874<p>
3875        The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
3876        object has value semantics. When a regex object appears on the right-hand
3877        side in the definition of another regex, it is as if the regex were embedded
3878        by value; that is, a copy of the nested regex is stored by the enclosing
3879        regex. The inner regex is invoked by the outer regex during pattern matching.
3880        The inner regex participates fully in the match, back-tracking as needed
3881        to make the match succeed.
3882      </p>
3883<p>
3884        Consider a text editor that has a regex-find feature with a whole-word option.
3885        You can implement this with xpressive as follows:
3886      </p>
3887<pre class="programlisting"><span class="identifier">find_dialog</span> <span class="identifier">dlg</span><span class="special">;</span>
3888<span class="keyword">if</span><span class="special">(</span> <span class="identifier">dialog_ok</span> <span class="special">==</span> <span class="identifier">dlg</span><span class="special">.</span><span class="identifier">do_modal</span><span class="special">()</span> <span class="special">)</span>
3889<span class="special">{</span>
3890    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">pattern</span> <span class="special">=</span> <span class="identifier">dlg</span><span class="special">.</span><span class="identifier">get_text</span><span class="special">();</span>          <span class="comment">// the pattern the user entered</span>
3891    <span class="keyword">bool</span> <span class="identifier">whole_word</span> <span class="special">=</span> <span class="identifier">dlg</span><span class="special">.</span><span class="identifier">whole_word</span><span class="special">.</span><span class="identifier">is_checked</span><span class="special">();</span> <span class="comment">// did the user select the whole-word option?</span>
3892
3893    <span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="identifier">pattern</span> <span class="special">);</span>        <span class="comment">// try to compile the pattern</span>
3894
3895    <span class="keyword">if</span><span class="special">(</span> <span class="identifier">whole_word</span> <span class="special">)</span>
3896    <span class="special">{</span>
3897        <span class="comment">// wrap the regex in begin-word / end-word assertions</span>
3898        <span class="identifier">re</span> <span class="special">=</span> <span class="identifier">bow</span> <span class="special">&gt;&gt;</span> <span class="identifier">re</span> <span class="special">&gt;&gt;</span> <span class="identifier">eow</span><span class="special">;</span>
3899    <span class="special">}</span>
3900
3901    <span class="comment">// ... use re ...</span>
3902<span class="special">}</span>
3903</pre>
3904<p>
3905        Look closely at this line:
3906      </p>
3907<pre class="programlisting"><span class="comment">// wrap the regex in begin-word / end-word assertions</span>
3908<span class="identifier">re</span> <span class="special">=</span> <span class="identifier">bow</span> <span class="special">&gt;&gt;</span> <span class="identifier">re</span> <span class="special">&gt;&gt;</span> <span class="identifier">eow</span><span class="special">;</span>
3909</pre>
3910<p>
3911        This line creates a new regex that embeds the old regex by value. Then, the
3912        new regex is assigned back to the original regex. Since a copy of the old
3913        regex was made on the right-hand side, this works as you might expect: the
3914        new regex has the behavior of the old regex wrapped in begin- and end-word
3915        assertions.
3916      </p>
3917<div class="note"><table border="0" summary="Note">
3918<tr>
3919<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
3920<th align="left">Note</th>
3921</tr>
3922<tr><td align="left" valign="top"><p>
3923          Note that <code class="computeroutput"><span class="identifier">re</span> <span class="special">=</span>
3924          <span class="identifier">bow</span> <span class="special">&gt;&gt;</span>
3925          <span class="identifier">re</span> <span class="special">&gt;&gt;</span>
3926          <span class="identifier">eow</span></code> does <span class="emphasis"><em>not</em></span>
3927          define a recursive regular expression, since regex objects embed by value
3928          by default. The next section shows how to define a recursive regular expression
3929          by embedding a regex by reference.
3930        </p></td></tr>
3931</table></div>
3932<h3>
3933<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h2"></a>
3934        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.embedding_a_regex_by_reference"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.embedding_a_regex_by_reference">Embedding
3935        a Regex by Reference</a>
3936      </h3>
3937<p>
3938        If you want to be able to build recursive regular expressions and context-free
3939        grammars, embedding a regex by value is not enough. You need to be able to
3940        make your regular expressions self-referential. Most regular expression engines
3941        don't give you that power, but xpressive does.
3942      </p>
3943<div class="tip"><table border="0" summary="Tip">
3944<tr>
3945<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../doc/src/images/tip.png"></td>
3946<th align="left">Tip</th>
3947</tr>
3948<tr><td align="left" valign="top"><p>
3949          The theoretical computer scientists out there will correctly point out
3950          that a self-referential regular expression is not "regular",
3951          so in the strict sense, xpressive isn't really a <span class="emphasis"><em>regular</em></span>
3952          expression engine at all. But as Larry Wall once said, "the term [regular expression] has
3953          grown with the capabilities of our pattern matching engines, so I'm not
3954          going to try to fight linguistic necessity here."
3955        </p></td></tr>
3956</table></div>
3957<p>
3958        Consider the following code, which uses the <code class="computeroutput"><span class="identifier">by_ref</span><span class="special">()</span></code> helper to define a recursive regular expression
3959        that matches balanced, nested parentheses:
3960      </p>
3961<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">parentheses</span><span class="special">;</span>
3962<span class="identifier">parentheses</span>                          <span class="comment">// A balanced set of parentheses ...</span>
3963    <span class="special">=</span> <span class="char">'('</span>                            <span class="comment">// is an opening parenthesis ...</span>
3964        <span class="special">&gt;&gt;</span>                           <span class="comment">// followed by ...</span>
3965         <span class="special">*(</span>                          <span class="comment">// zero or more ...</span>
3966            <span class="identifier">keep</span><span class="special">(</span> <span class="special">+~(</span><span class="identifier">set</span><span class="special">=</span><span class="char">'('</span><span class="special">,</span><span class="char">')'</span><span class="special">)</span> <span class="special">)</span>  <span class="comment">// of a bunch of things that are not parentheses ...</span>
3967          <span class="special">|</span>                          <span class="comment">// or ...</span>
3968            <span class="identifier">by_ref</span><span class="special">(</span><span class="identifier">parentheses</span><span class="special">)</span>      <span class="comment">// a balanced set of parentheses</span>
3969          <span class="special">)</span>                          <span class="comment">//   (ooh, recursion!) ...</span>
3970        <span class="special">&gt;&gt;</span>                           <span class="comment">// followed by ...</span>
3971      <span class="char">')'</span>                            <span class="comment">// a closing parenthesis</span>
3972    <span class="special">;</span>
3973</pre>
3974<p>
3975        Matching balanced, nested tags is an important text processing task, and
3976        it is one that "classic" regular expressions cannot do. The <code class="computeroutput"><span class="identifier">by_ref</span><span class="special">()</span></code>
3977        helper makes it possible. It allows one regex object to be embedded in another
3978        <span class="emphasis"><em>by reference</em></span>. Since the right-hand side holds <code class="computeroutput"><span class="identifier">parentheses</span></code> by reference, assigning the
3979        right-hand side back to <code class="computeroutput"><span class="identifier">parentheses</span></code>
3980        creates a cycle, which will execute recursively.
3981      </p>
3982<h3>
3983<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h3"></a>
3984        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.building_a_grammar"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.building_a_grammar">Building
3985        a Grammar</a>
3986      </h3>
3987<p>
3988        Once we allow self-reference in our regular expressions, the genie is out
3989        of the bottle and all manner of fun things are possible. In particular, we
3990        can now build grammars out of regular expressions. Let's have a look at the
3991        text-book grammar example: the humble calculator.
3992      </p>
3993<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">group</span><span class="special">,</span> <span class="identifier">factor</span><span class="special">,</span> <span class="identifier">term</span><span class="special">,</span> <span class="identifier">expression</span><span class="special">;</span>
3994
3995<span class="identifier">group</span>       <span class="special">=</span> <span class="char">'('</span> <span class="special">&gt;&gt;</span> <span class="identifier">by_ref</span><span class="special">(</span><span class="identifier">expression</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">')'</span><span class="special">;</span>
3996<span class="identifier">factor</span>      <span class="special">=</span> <span class="special">+</span><span class="identifier">_d</span> <span class="special">|</span> <span class="identifier">group</span><span class="special">;</span>
3997<span class="identifier">term</span>        <span class="special">=</span> <span class="identifier">factor</span> <span class="special">&gt;&gt;</span> <span class="special">*((</span><span class="char">'*'</span> <span class="special">&gt;&gt;</span> <span class="identifier">factor</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="char">'/'</span> <span class="special">&gt;&gt;</span> <span class="identifier">factor</span><span class="special">));</span>
3998<span class="identifier">expression</span>  <span class="special">=</span> <span class="identifier">term</span> <span class="special">&gt;&gt;</span> <span class="special">*((</span><span class="char">'+'</span> <span class="special">&gt;&gt;</span> <span class="identifier">term</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="char">'-'</span> <span class="special">&gt;&gt;</span> <span class="identifier">term</span><span class="special">));</span>
3999</pre>
4000<p>
4001        The regex <code class="computeroutput"><span class="identifier">expression</span></code> defined
4002        above does something rather remarkable for a regular expression: it matches
4003        mathematical expressions. For example, if the input string were <code class="computeroutput"><span class="string">"foo 9*(10+3) bar"</span></code>, this pattern
4004        would match <code class="computeroutput"><span class="string">"9*(10+3)"</span></code>.
4005        It only matches well-formed mathematical expressions, where the parentheses
4006        are balanced and the infix operators have two arguments each. Don't try this
4007        with just any regular expression engine!
4008      </p>
4009<p>
4010        Let's take a closer look at this regular expression grammar. Notice that
4011        it is cyclic: <code class="computeroutput"><span class="identifier">expression</span></code>
4012        is implemented in terms of <code class="computeroutput"><span class="identifier">term</span></code>,
4013        which is implemented in terms of <code class="computeroutput"><span class="identifier">factor</span></code>,
4014        which is implemented in terms of <code class="computeroutput"><span class="identifier">group</span></code>,
4015        which is implemented in terms of <code class="computeroutput"><span class="identifier">expression</span></code>,
4016        closing the loop. In general, the way to define a cyclic grammar is to forward-declare
4017        the regex objects and embed by reference those regular expressions that have
4018        not yet been initialized. In the above grammar, there is only one place where
4019        we need to reference a regex object that has not yet been initialized: the
4020        definition of <code class="computeroutput"><span class="identifier">group</span></code>. In that
4021        place, we use <code class="computeroutput"><span class="identifier">by_ref</span><span class="special">()</span></code>
4022        to embed <code class="computeroutput"><span class="identifier">expression</span></code> by reference.
4023        In all other places, it is sufficient to embed the other regex objects by
4024        value, since they have already been initialized and their values will not
4025        change.
4026      </p>
4027<div class="tip"><table border="0" summary="Tip">
4028<tr>
4029<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../doc/src/images/tip.png"></td>
4030<th align="left">Tip</th>
4031</tr>
4032<tr><td align="left" valign="top"><p>
4033          <span class="bold"><strong>Embed by value if possible</strong></span> <br> <br>
4034          In general, prefer embedding regular expressions by value rather than by
4035          reference. It involves one less indirection, making your patterns match
4036          a little faster. Besides, value semantics are simpler and will make your
4037          grammars easier to reason about. Don't worry about the expense of "copying"
4038          a regex. Each regex object shares its implementation with all of its copies.
4039        </p></td></tr>
4040</table></div>
4041<h3>
4042<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h4"></a>
4043        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.dynamic_regex_grammars"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.dynamic_regex_grammars">Dynamic
4044        Regex Grammars</a>
4045      </h3>
4046<p>
4047        Using <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>,
4048        you can also build grammars out of dynamic regular expressions. You do that
4049        by creating named regexes, and referring to other regexes by name. Each
4050        <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>
4051        instance keeps a mapping from names to regexes that have been created with
4052        it.
4053      </p>
4054<p>
4055        You can create a named dynamic regex by prefacing your regex with <code class="computeroutput"><span class="string">"(?$name=)"</span></code>, where <span class="emphasis"><em>name</em></span>
4056        is the name of the regex. You can refer to a named regex from another regex
4057        with <code class="computeroutput"><span class="string">"(?$name)"</span></code>. The
4058        named regex does not need to exist yet at the time it is referenced in another
4059        regex, but it must exist by the time you use the regex.
4060      </p>
4061<p>
4062        Below is a code fragment that uses dynamic regex grammars to implement the
4063        calculator example from above.
4064      </p>
4065<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
4066<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">regex_constants</span><span class="special">;</span>
4067
4068<span class="identifier">sregex</span> <span class="identifier">expr</span><span class="special">;</span>
4069
4070<span class="special">{</span>
4071     <span class="identifier">sregex_compiler</span> <span class="identifier">compiler</span><span class="special">;</span>
4072     <span class="identifier">syntax_option_type</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">ignore_white_space</span><span class="special">;</span>
4073
4074            <span class="identifier">compiler</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(? $group  = ) \\( (? $expr ) \\) "</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
4075            <span class="identifier">compiler</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(? $factor = ) \\d+ | (? $group ) "</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
4076            <span class="identifier">compiler</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(? $term   = ) (? $factor )"</span>
4077                             <span class="string">" ( \\* (? $factor ) | / (? $factor ) )* "</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
4078     <span class="identifier">expr</span> <span class="special">=</span> <span class="identifier">compiler</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span><span class="string">"(? $expr   = ) (? $term )"</span>
4079                             <span class="string">"   ( \\+ (? $term ) | - (? $term )   )* "</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
4080<span class="special">}</span>
4081
4082<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"foo 9*(10+3) bar"</span><span class="special">);</span>
4083<span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
4084
4085<span class="keyword">if</span><span class="special">(</span><span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">expr</span><span class="special">))</span>
4086<span class="special">{</span>
4087     <span class="comment">// This prints "9*(10+3)":</span>
4088     <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
4089<span class="special">}</span>
4090</pre>
4091<p>
4092        As with static regex grammars, nested regex invocations create nested match
4093        results (see <span class="emphasis"><em>Nested Results</em></span> below). The result is a
4094        complete parse tree for string that matched. Unlike static regexes, dynamic
4095        regexes are always embedded by reference, not by value.
4096      </p>
4097<h3>
4098<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h5"></a>
4099        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.cyclic_patterns__copying_and_memory_management__oh_my_"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.cyclic_patterns__copying_and_memory_management__oh_my_">Cyclic
4100        Patterns, Copying and Memory Management, Oh My!</a>
4101      </h3>
4102<p>
4103        The calculator examples above raises a number of very complicated memory-management
4104        issues. Each of the four regex objects refer to each other, some directly
4105        and some indirectly, some by value and some by reference. What if we were
4106        to return one of them from a function and let the others go out of scope?
4107        What becomes of the references? The answer is that the regex objects are
4108        internally reference counted, such that they keep their referenced regex
4109        objects alive as long as they need them. So passing a regex object by value
4110        is never a problem, even if it refers to other regex objects that have gone
4111        out of scope.
4112      </p>
4113<p>
4114        Those of you who have dealt with reference counting are probably familiar
4115        with its Achilles Heel: cyclic references. If regex objects are reference
4116        counted, what happens to cycles like the one created in the calculator examples?
4117        Are they leaked? The answer is no, they are not leaked. The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
4118        object has some tricky reference tracking code that ensures that even cyclic
4119        regex grammars are cleaned up when the last external reference goes away.
4120        So don't worry about it. Create cyclic grammars, pass your regex objects
4121        around and copy them all you want. It is fast and efficient and guaranteed
4122        not to leak or result in dangling references.
4123      </p>
4124<h3>
4125<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h6"></a>
4126        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.nested_regexes_and_sub_match_scoping"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.nested_regexes_and_sub_match_scoping">Nested
4127        Regexes and Sub-Match Scoping</a>
4128      </h3>
4129<p>
4130        Nested regular expressions raise the issue of sub-match scoping. If both
4131        the inner and outer regex write to and read from the same sub-match vector,
4132        chaos would ensue. The inner regex would stomp on the sub-matches written
4133        by the outer regex. For example, what does this do?
4134      </p>
4135<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">inner</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"(.)\\1"</span> <span class="special">);</span>
4136<span class="identifier">sregex</span> <span class="identifier">outer</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">s1</span><span class="special">=</span> <span class="identifier">_</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="identifier">inner</span> <span class="special">&gt;&gt;</span> <span class="identifier">s1</span><span class="special">;</span>
4137</pre>
4138<p>
4139        The author probably didn't intend for the inner regex to overwrite the sub-match
4140        written by the outer regex. The problem is particularly acute when the inner
4141        regex is accepted from the user as input. The author has no way of knowing
4142        whether the inner regex will stomp the sub-match vector or not. This is clearly
4143        not acceptable.
4144      </p>
4145<p>
4146        Instead, what actually happens is that each invocation of a nested regex
4147        gets its own scope. Sub-matches belong to that scope. That is, each nested
4148        regex invocation gets its own copy of the sub-match vector to play with,
4149        so there is no way for an inner regex to stomp on the sub-matches of an outer
4150        regex. So, for example, the regex <code class="computeroutput"><span class="identifier">outer</span></code>
4151        defined above would match <code class="computeroutput"><span class="string">"ABBA"</span></code>,
4152        as it should.
4153      </p>
4154<h3>
4155<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h7"></a>
4156        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.nested_results"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.nested_results">Nested
4157        Results</a>
4158      </h3>
4159<p>
4160        If nested regexes have their own sub-matches, there should be a way to access
4161        them after a successful match. In fact, there is. After a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
4162        or <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>,
4163        the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
4164        struct behaves like the head of a tree of nested results. The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
4165        class provides a <code class="computeroutput"><span class="identifier">nested_results</span><span class="special">()</span></code> member function that returns an ordered
4166        sequence of <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
4167        structures, representing the results of the nested regexes. The order of
4168        the nested results is the same as the order in which the nested regex objects
4169        matched.
4170      </p>
4171<p>
4172        Take as an example the regex for balanced, nested parentheses we saw earlier:
4173      </p>
4174<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">parentheses</span><span class="special">;</span>
4175<span class="identifier">parentheses</span> <span class="special">=</span> <span class="char">'('</span> <span class="special">&gt;&gt;</span> <span class="special">*(</span> <span class="identifier">keep</span><span class="special">(</span> <span class="special">+~(</span><span class="identifier">set</span><span class="special">=</span><span class="char">'('</span><span class="special">,</span><span class="char">')'</span><span class="special">)</span> <span class="special">)</span> <span class="special">|</span> <span class="identifier">by_ref</span><span class="special">(</span><span class="identifier">parentheses</span><span class="special">)</span> <span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">')'</span><span class="special">;</span>
4176
4177<span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
4178<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span> <span class="string">"blah blah( a(b)c (c(e)f (g)h )i (j)6 )blah"</span> <span class="special">);</span>
4179
4180<span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_search</span><span class="special">(</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">parentheses</span> <span class="special">)</span> <span class="special">)</span>
4181<span class="special">{</span>
4182    <span class="comment">// display the whole match</span>
4183    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4184
4185    <span class="comment">// display the nested results</span>
4186    <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span>
4187        <span class="identifier">what</span><span class="special">.</span><span class="identifier">nested_results</span><span class="special">().</span><span class="identifier">begin</span><span class="special">(),</span>
4188        <span class="identifier">what</span><span class="special">.</span><span class="identifier">nested_results</span><span class="special">().</span><span class="identifier">end</span><span class="special">(),</span>
4189        <span class="identifier">output_nested_results</span><span class="special">()</span> <span class="special">);</span>
4190<span class="special">}</span>
4191</pre>
4192<p>
4193        This program displays the following:
4194      </p>
4195<pre class="programlisting">( a(b)c (c(e)f (g)h )i (j)6 )
4196    (b)
4197    (c(e)f (g)h )
4198        (e)
4199        (g)
4200    (j)
4201</pre>
4202<p>
4203        Here you can see how the results are nested and that they are stored in the
4204        order in which they are found.
4205      </p>
4206<div class="tip"><table border="0" summary="Tip">
4207<tr>
4208<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../doc/src/images/tip.png"></td>
4209<th align="left">Tip</th>
4210</tr>
4211<tr><td align="left" valign="top"><p>
4212          See the definition of <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.display_a_tree_of_nested_results">output_nested_results</a>
4213          in the <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">Examples</a>
4214          section.
4215        </p></td></tr>
4216</table></div>
4217<h3>
4218<a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.h8"></a>
4219        <span class="phrase"><a name="boost_xpressive.user_s_guide.grammars_and_nested_matches.filtering_nested_results"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.filtering_nested_results">Filtering
4220        Nested Results</a>
4221      </h3>
4222<p>
4223        Sometimes a regex will have several nested regex objects, and you want to
4224        know which result corresponds to which regex object. That's where <code class="computeroutput"><span class="identifier">basic_regex</span><span class="special">&lt;&gt;::</span><span class="identifier">regex_id</span><span class="special">()</span></code>
4225        and <code class="computeroutput"><span class="identifier">match_results</span><span class="special">&lt;&gt;::</span><span class="identifier">regex_id</span><span class="special">()</span></code>
4226        come in handy. When iterating over the nested results, you can compare the
4227        regex id from the results to the id of the regex object you're interested
4228        in.
4229      </p>
4230<p>
4231        To make this a bit easier, xpressive provides a predicate to make it simple
4232        to iterate over just the results that correspond to a certain nested regex.
4233        It is called <code class="computeroutput"><span class="identifier">regex_id_filter_predicate</span></code>,
4234        and it is intended to be used with <a href="../../../libs/iterator/doc/index.html" target="_top">Boost.Iterator</a>.
4235        You can use it as follows:
4236      </p>
4237<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">name</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">alpha</span><span class="special">;</span>
4238<span class="identifier">sregex</span> <span class="identifier">integer</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">_d</span><span class="special">;</span>
4239<span class="identifier">sregex</span> <span class="identifier">re</span> <span class="special">=</span> <span class="special">*(</span> <span class="special">*</span><span class="identifier">_s</span> <span class="special">&gt;&gt;</span> <span class="special">(</span> <span class="identifier">name</span> <span class="special">|</span> <span class="identifier">integer</span> <span class="special">)</span> <span class="special">);</span>
4240
4241<span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
4242<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span> <span class="string">"marsha 123 jan 456 cindy 789"</span> <span class="special">);</span>
4243
4244<span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">re</span> <span class="special">)</span> <span class="special">)</span>
4245<span class="special">{</span>
4246    <span class="identifier">smatch</span><span class="special">::</span><span class="identifier">nested_results_type</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">begin</span> <span class="special">=</span> <span class="identifier">what</span><span class="special">.</span><span class="identifier">nested_results</span><span class="special">().</span><span class="identifier">begin</span><span class="special">();</span>
4247    <span class="identifier">smatch</span><span class="special">::</span><span class="identifier">nested_results_type</span><span class="special">::</span><span class="identifier">const_iterator</span> <span class="identifier">end</span>   <span class="special">=</span> <span class="identifier">what</span><span class="special">.</span><span class="identifier">nested_results</span><span class="special">().</span><span class="identifier">end</span><span class="special">();</span>
4248
4249    <span class="comment">// declare filter predicates to select just the names or the integers</span>
4250    <span class="identifier">sregex_id_filter_predicate</span> <span class="identifier">name_id</span><span class="special">(</span> <span class="identifier">name</span><span class="special">.</span><span class="identifier">regex_id</span><span class="special">()</span> <span class="special">);</span>
4251    <span class="identifier">sregex_id_filter_predicate</span> <span class="identifier">integer_id</span><span class="special">(</span> <span class="identifier">integer</span><span class="special">.</span><span class="identifier">regex_id</span><span class="special">()</span> <span class="special">);</span>
4252
4253    <span class="comment">// iterate over only the results from the name regex</span>
4254    <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span>
4255        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">(</span> <span class="identifier">name_id</span><span class="special">,</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span> <span class="special">),</span>
4256        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">(</span> <span class="identifier">name_id</span><span class="special">,</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">end</span> <span class="special">),</span>
4257        <span class="identifier">output_result</span>
4258        <span class="special">);</span>
4259
4260    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4261
4262    <span class="comment">// iterate over only the results from the integer regex</span>
4263    <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span>
4264        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">(</span> <span class="identifier">integer_id</span><span class="special">,</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span> <span class="special">),</span>
4265        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">(</span> <span class="identifier">integer_id</span><span class="special">,</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">end</span> <span class="special">),</span>
4266        <span class="identifier">output_result</span>
4267        <span class="special">);</span>
4268<span class="special">}</span>
4269</pre>
4270<p>
4271        where <code class="computeroutput"><span class="identifier">output_results</span></code> is a
4272        simple function that takes a <code class="computeroutput"><span class="identifier">smatch</span></code>
4273        and displays the full match. Notice how we use the <code class="computeroutput"><span class="identifier">regex_id_filter_predicate</span></code>
4274        together with <code class="computeroutput"><span class="identifier">basic_regex</span><span class="special">&lt;&gt;::</span><span class="identifier">regex_id</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_filter_iterator</span><span class="special">()</span></code> from the <a href="../../../libs/iterator/doc/index.html" target="_top">Boost.Iterator</a>
4275        to select only those results corresponding to a particular nested regex.
4276        This program displays the following:
4277      </p>
4278<pre class="programlisting">marsha
4279jan
4280cindy
4281123
4282456
4283789
4284</pre>
4285</div>
4286<div class="section">
4287<div class="titlepage"><div><div><h3 class="title">
4288<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions" title="Semantic Actions and User-Defined Assertions">Semantic
4289      Actions and User-Defined Assertions</a>
4290</h3></div></div></div>
4291<h3>
4292<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h0"></a>
4293        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.overview">Overview</a>
4294      </h3>
4295<p>
4296        Imagine you want to parse an input string and build a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;&gt;</span></code>
4297        from it. For something like that, matching a regular expression isn't enough.
4298        You want to <span class="emphasis"><em>do something</em></span> when parts of your regular
4299        expression match. Xpressive lets you attach semantic actions to parts of
4300        your static regular expressions. This section shows you how.
4301      </p>
4302<h3>
4303<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h1"></a>
4304        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.semantic_actions"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.semantic_actions">Semantic
4305        Actions</a>
4306      </h3>
4307<p>
4308        Consider the following code, which uses xpressive's semantic actions to parse
4309        a string of word/integer pairs and stuffs them into a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;&gt;</span></code>.
4310        It is described below.
4311      </p>
4312<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
4313<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
4314<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4315<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">regex_actions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4316<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
4317
4318<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
4319<span class="special">{</span>
4320    <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">result</span><span class="special">;</span>
4321    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"aaa=&gt;1 bbb=&gt;23 ccc=&gt;456"</span><span class="special">);</span>
4322
4323    <span class="comment">// Match a word and an integer, separated by =&gt;,</span>
4324    <span class="comment">// and then stuff the result into a std::map&lt;&gt;</span>
4325    <span class="identifier">sregex</span> <span class="identifier">pair</span> <span class="special">=</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">s1</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="string">"=&gt;"</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s2</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_d</span><span class="special">)</span> <span class="special">)</span>
4326        <span class="special">[</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">result</span><span class="special">)[</span><span class="identifier">s1</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">s2</span><span class="special">)</span> <span class="special">];</span>
4327
4328    <span class="comment">// Match one or more word/integer pairs, separated</span>
4329    <span class="comment">// by whitespace.</span>
4330    <span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="identifier">pair</span> <span class="special">&gt;&gt;</span> <span class="special">*(+</span><span class="identifier">_s</span> <span class="special">&gt;&gt;</span> <span class="identifier">pair</span><span class="special">);</span>
4331
4332    <span class="keyword">if</span><span class="special">(</span><span class="identifier">regex_match</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">))</span>
4333    <span class="special">{</span>
4334        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"aaa"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4335        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"bbb"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4336        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"ccc"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4337    <span class="special">}</span>
4338
4339    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
4340<span class="special">}</span>
4341</pre>
4342<p>
4343        This program prints the following:
4344      </p>
4345<pre class="programlisting">1
434623
4347456
4348</pre>
4349<p>
4350        The regular expression <code class="computeroutput"><span class="identifier">pair</span></code>
4351        has two parts: the pattern and the action. The pattern says to match a word,
4352        capturing it in sub-match 1, and an integer, capturing it in sub-match 2,
4353        separated by <code class="computeroutput"><span class="string">"=&gt;"</span></code>.
4354        The action is the part in square brackets: <code class="computeroutput"><span class="special">[</span>
4355        <span class="identifier">ref</span><span class="special">(</span><span class="identifier">result</span><span class="special">)[</span><span class="identifier">s1</span><span class="special">]</span> <span class="special">=</span>
4356        <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">s2</span><span class="special">)</span> <span class="special">]</span></code>. It says
4357        to take sub-match one and use it to index into the <code class="computeroutput"><span class="identifier">results</span></code>
4358        map, and assign to it the result of converting sub-match 2 to an integer.
4359      </p>
4360<div class="note"><table border="0" summary="Note">
4361<tr>
4362<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
4363<th align="left">Note</th>
4364</tr>
4365<tr><td align="left" valign="top"><p>
4366          To use semantic actions with your static regexes, you must <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">regex_actions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
4367        </p></td></tr>
4368</table></div>
4369<p>
4370        How does this work? Just as the rest of the static regular expression, the
4371        part between brackets is an expression template. It encodes the action and
4372        executes it later. The expression <code class="computeroutput"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span></code> creates a lazy reference to the <code class="computeroutput"><span class="identifier">result</span></code> object. The larger expression <code class="computeroutput"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">result</span><span class="special">)[</span><span class="identifier">s1</span><span class="special">]</span></code>
4373        is a lazy map index operation. Later, when this action is getting executed,
4374        <code class="computeroutput"><span class="identifier">s1</span></code> gets replaced with the
4375        first <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>.
4376        Likewise, when <code class="computeroutput"><span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">s2</span><span class="special">)</span></code> gets executed, <code class="computeroutput"><span class="identifier">s2</span></code>
4377        is replaced with the second <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>.
4378        The <code class="computeroutput"><span class="identifier">as</span><span class="special">&lt;&gt;</span></code>
4379        action converts its argument to the requested type using Boost.Lexical_cast.
4380        The effect of the whole action is to insert a new word/integer pair into
4381        the map.
4382      </p>
4383<div class="note"><table border="0" summary="Note">
4384<tr>
4385<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
4386<th align="left">Note</th>
4387</tr>
4388<tr><td align="left" valign="top"><p>
4389          There is an important difference between the function <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">()</span></code> in <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">ref</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
4390          and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">::</span><span class="identifier">ref</span><span class="special">()</span></code>
4391          in <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">regex_actions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>. The first returns a plain <code class="computeroutput"><span class="identifier">reference_wrapper</span><span class="special">&lt;&gt;</span></code>
4392          which behaves in many respects like an ordinary reference. By contrast,
4393          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">::</span><span class="identifier">ref</span><span class="special">()</span></code>
4394          returns a <span class="emphasis"><em>lazy</em></span> reference that you can use in expressions
4395          that are executed lazily. That is why we can say <code class="computeroutput"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">result</span><span class="special">)[</span><span class="identifier">s1</span><span class="special">]</span></code>, even though <code class="computeroutput"><span class="identifier">result</span></code>
4396          doesn't have an <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code>
4397          that would accept <code class="computeroutput"><span class="identifier">s1</span></code>.
4398        </p></td></tr>
4399</table></div>
4400<p>
4401        In addition to the sub-match placeholders <code class="computeroutput"><span class="identifier">s1</span></code>,
4402        <code class="computeroutput"><span class="identifier">s2</span></code>, etc., you can also use
4403        the placeholder <code class="computeroutput"><span class="identifier">_</span></code> within
4404        an action to refer back to the string matched by the sub-expression to which
4405        the action is attached. For instance, you can use the following regex to
4406        match a bunch of digits, interpret them as an integer and assign the result
4407        to a local variable:
4408      </p>
4409<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
4410<span class="comment">// Here, _ refers back to all the</span>
4411<span class="comment">// characters matched by (+_d)</span>
4412<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">(+</span><span class="identifier">_d</span><span class="special">)[</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">)</span> <span class="special">];</span>
4413</pre>
4414<h4>
4415<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h2"></a>
4416        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.lazy_action_execution"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.lazy_action_execution">Lazy
4417        Action Execution</a>
4418      </h4>
4419<p>
4420        What does it mean, exactly, to attach an action to part of a regular expression
4421        and perform a match? When does the action execute? If the action is part
4422        of a repeated sub-expression, does the action execute once or many times?
4423        And if the sub-expression initially matches, but ultimately fails because
4424        the rest of the regular expression fails to match, is the action executed
4425        at all?
4426      </p>
4427<p>
4428        The answer is that by default, actions are executed <span class="emphasis"><em>lazily</em></span>.
4429        When a sub-expression matches a string, its action is placed on a queue,
4430        along with the current values of any sub-matches to which the action refers.
4431        If the match algorithm must backtrack, actions are popped off the queue as
4432        necessary. Only after the entire regex has matched successfully are the actions
4433        actually exeucted. They are executed all at once, in the order in which they
4434        were added to the queue, as the last step before <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
4435        returns.
4436      </p>
4437<p>
4438        For example, consider the following regex that increments a counter whenever
4439        it finds a digit.
4440      </p>
4441<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
4442<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"1!2!3?"</span><span class="special">);</span>
4443<span class="comment">// count the exciting digits, but not the</span>
4444<span class="comment">// questionable ones.</span>
4445<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span>
4446<span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">rex</span><span class="special">);</span>
4447<span class="identifier">assert</span><span class="special">(</span> <span class="identifier">i</span> <span class="special">==</span> <span class="number">2</span> <span class="special">);</span>
4448</pre>
4449<p>
4450        The action <code class="computeroutput"><span class="special">++</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span></code>
4451        is queued three times: once for each found digit. But it is only <span class="emphasis"><em>executed</em></span>
4452        twice: once for each digit that precedes a <code class="computeroutput"><span class="char">'!'</span></code>
4453        character. When the <code class="computeroutput"><span class="char">'?'</span></code> character
4454        is encountered, the match algorithm backtracks, removing the final action
4455        from the queue.
4456      </p>
4457<h4>
4458<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h3"></a>
4459        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.immediate_action_execution"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.immediate_action_execution">Immediate
4460        Action Execution</a>
4461      </h4>
4462<p>
4463        When you want semantic actions to execute immediately, you can wrap the sub-expression
4464        containing the action in a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/keep.html" title="Function template keep">keep()</a></code></code>.
4465        <code class="computeroutput"><span class="identifier">keep</span><span class="special">()</span></code>
4466        turns off back-tracking for its sub-expression, but it also causes any actions
4467        queued by the sub-expression to execute at the end of the <code class="computeroutput"><span class="identifier">keep</span><span class="special">()</span></code>. It is as if the sub-expression in the
4468        <code class="computeroutput"><span class="identifier">keep</span><span class="special">()</span></code>
4469        were compiled into an independent regex object, and matching the <code class="computeroutput"><span class="identifier">keep</span><span class="special">()</span></code>
4470        is like a separate invocation of <code class="computeroutput"><span class="identifier">regex_search</span><span class="special">()</span></code>. It matches characters and executes actions
4471        but never backtracks or unwinds. For example, imagine the above example had
4472        been written as follows:
4473      </p>
4474<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
4475<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"1!2!3?"</span><span class="special">);</span>
4476<span class="comment">// count all the digits.</span>
4477<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">keep</span><span class="special">(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">]</span> <span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span>
4478<span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">rex</span><span class="special">);</span>
4479<span class="identifier">assert</span><span class="special">(</span> <span class="identifier">i</span> <span class="special">==</span> <span class="number">3</span> <span class="special">);</span>
4480</pre>
4481<p>
4482        We have wrapped the sub-expression <code class="computeroutput"><span class="identifier">_d</span>
4483        <span class="special">[</span> <span class="special">++</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">]</span></code> in <code class="computeroutput"><span class="identifier">keep</span><span class="special">()</span></code>.
4484        Now, whenever this regex matches a digit, the action will be queued and then
4485        immediately executed before we try to match a <code class="computeroutput"><span class="char">'!'</span></code>
4486        character. In this case, the action executes three times.
4487      </p>
4488<div class="note"><table border="0" summary="Note">
4489<tr>
4490<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
4491<th align="left">Note</th>
4492</tr>
4493<tr><td align="left" valign="top"><p>
4494          Like <code class="computeroutput"><span class="identifier">keep</span><span class="special">()</span></code>,
4495          actions within <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/before.html" title="Function template before">before()</a></code></code>
4496          and <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/after.html" title="Function template after">after()</a></code></code>
4497          are also executed early when their sub-expressions have matched.
4498        </p></td></tr>
4499</table></div>
4500<h4>
4501<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h4"></a>
4502        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.lazy_functions"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.lazy_functions">Lazy
4503        Functions</a>
4504      </h4>
4505<p>
4506        So far, we've seen how to write semantic actions consisting of variables
4507        and operators. But what if you want to be able to call a function from a
4508        semantic action? Xpressive provides a mechanism to do this.
4509      </p>
4510<p>
4511        The first step is to define a function object type. Here, for instance, is
4512        a function object type that calls <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code> on its argument:
4513      </p>
4514<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">push_impl</span>
4515<span class="special">{</span>
4516    <span class="comment">// Result type, needed for tr1::result_of</span>
4517    <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="identifier">result_type</span><span class="special">;</span>
4518
4519    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Sequence</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Value</span><span class="special">&gt;</span>
4520    <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Sequence</span> <span class="special">&amp;</span><span class="identifier">seq</span><span class="special">,</span> <span class="identifier">Value</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">val</span><span class="special">)</span> <span class="keyword">const</span>
4521    <span class="special">{</span>
4522        <span class="identifier">seq</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="identifier">val</span><span class="special">);</span>
4523    <span class="special">}</span>
4524<span class="special">};</span>
4525</pre>
4526<p>
4527        The next step is to use xpressive's <code class="computeroutput"><span class="identifier">function</span><span class="special">&lt;&gt;</span></code> template to define a function object
4528        named <code class="computeroutput"><span class="identifier">push</span></code>:
4529      </p>
4530<pre class="programlisting"><span class="comment">// Global "push" function object.</span>
4531<span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">push_impl</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">push</span> <span class="special">=</span> <span class="special">{{}};</span>
4532</pre>
4533<p>
4534        The initialization looks a bit odd, but this is because <code class="computeroutput"><span class="identifier">push</span></code>
4535        is being statically initialized. That means it doesn't need to be constructed
4536        at runtime. We can use <code class="computeroutput"><span class="identifier">push</span></code>
4537        in semantic actions as follows:
4538      </p>
4539<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">stack</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ints</span><span class="special">;</span>
4540<span class="comment">// Match digits, cast them to an int</span>
4541<span class="comment">// and push it on the stack.</span>
4542<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">(+</span><span class="identifier">_d</span><span class="special">)[</span><span class="identifier">push</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">ints</span><span class="special">),</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">))];</span>
4543</pre>
4544<p>
4545        You'll notice that doing it this way causes member function invocations to
4546        look like ordinary function invocations. You can choose to write your semantic
4547        action in a different way that makes it look a bit more like a member function
4548        call:
4549      </p>
4550<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">(+</span><span class="identifier">_d</span><span class="special">)[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">ints</span><span class="special">)-&gt;*</span><span class="identifier">push</span><span class="special">(</span><span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">))];</span>
4551</pre>
4552<p>
4553        Xpressive recognizes the use of the <code class="computeroutput"><span class="special">-&gt;*</span></code>
4554        and treats this expression exactly the same as the one above.
4555      </p>
4556<p>
4557        When your function object must return a type that depends on its arguments,
4558        you can use a <code class="computeroutput"><span class="identifier">result</span><span class="special">&lt;&gt;</span></code>
4559        member template instead of the <code class="computeroutput"><span class="identifier">result_type</span></code>
4560        typedef. Here, for example, is a <code class="computeroutput"><span class="identifier">first</span></code>
4561        function object that returns the <code class="computeroutput"><span class="identifier">first</span></code>
4562        member of a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;&gt;</span></code>
4563        or <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>:
4564      </p>
4565<pre class="programlisting"><span class="comment">// Function object that returns the</span>
4566<span class="comment">// first element of a pair.</span>
4567<span class="keyword">struct</span> <span class="identifier">first_impl</span>
4568<span class="special">{</span>
4569    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">result</span> <span class="special">{};</span>
4570
4571    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Pair</span><span class="special">&gt;</span>
4572    <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">&lt;</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">Pair</span><span class="special">)&gt;</span>
4573    <span class="special">{</span>
4574        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">Pair</span><span class="special">&gt;</span>
4575            <span class="special">::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">first_type</span> <span class="identifier">type</span><span class="special">;</span>
4576    <span class="special">};</span>
4577
4578    <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Pair</span><span class="special">&gt;</span>
4579    <span class="keyword">typename</span> <span class="identifier">Pair</span><span class="special">::</span><span class="identifier">first_type</span>
4580    <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Pair</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">p</span><span class="special">)</span> <span class="keyword">const</span>
4581    <span class="special">{</span>
4582        <span class="keyword">return</span> <span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span><span class="special">;</span>
4583    <span class="special">}</span>
4584<span class="special">};</span>
4585
4586<span class="comment">// OK, use as first(s1) to get the begin iterator</span>
4587<span class="comment">// of the sub-match referred to by s1.</span>
4588<span class="identifier">function</span><span class="special">&lt;</span><span class="identifier">first_impl</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">first</span> <span class="special">=</span> <span class="special">{{}};</span>
4589</pre>
4590<h4>
4591<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h5"></a>
4592        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.referring_to_local_variables"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.referring_to_local_variables">Referring
4593        to Local Variables</a>
4594      </h4>
4595<p>
4596        As we've seen in the examples above, we can refer to local variables within
4597        an actions using <code class="computeroutput"><span class="identifier">xpressive</span><span class="special">::</span><span class="identifier">ref</span><span class="special">()</span></code>.
4598        Any such variables are held by reference by the regular expression, and care
4599        should be taken to avoid letting those references dangle. For instance, in
4600        the following code, the reference to <code class="computeroutput"><span class="identifier">i</span></code>
4601        is left to dangle when <code class="computeroutput"><span class="identifier">bad_voodoo</span><span class="special">()</span></code> returns:
4602      </p>
4603<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">bad_voodoo</span><span class="special">()</span>
4604<span class="special">{</span>
4605    <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
4606    <span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span>
4607    <span class="comment">// ERROR! rex refers by reference to a local</span>
4608    <span class="comment">// variable, which will dangle after bad_voodoo()</span>
4609    <span class="comment">// returns.</span>
4610    <span class="keyword">return</span> <span class="identifier">rex</span><span class="special">;</span>
4611<span class="special">}</span>
4612</pre>
4613<p>
4614        When writing semantic actions, it is your responsibility to make sure that
4615        all the references do not dangle. One way to do that would be to make the
4616        variables shared pointers that are held by the regex by value.
4617      </p>
4618<pre class="programlisting"><span class="identifier">sregex</span> <span class="identifier">good_voodoo</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">pi</span><span class="special">)</span>
4619<span class="special">{</span>
4620    <span class="comment">// Use val() to hold the shared_ptr by value:</span>
4621    <span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++*</span><span class="identifier">val</span><span class="special">(</span><span class="identifier">pi</span><span class="special">)</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span>
4622    <span class="comment">// OK, rex holds a reference count to the integer.</span>
4623    <span class="keyword">return</span> <span class="identifier">rex</span><span class="special">;</span>
4624<span class="special">}</span>
4625</pre>
4626<p>
4627        In the above code, we use <code class="computeroutput"><span class="identifier">xpressive</span><span class="special">::</span><span class="identifier">val</span><span class="special">()</span></code>
4628        to hold the shared pointer by value. That's not normally necessary because
4629        local variables appearing in actions are held by value by default, but in
4630        this case, it is necessary. Had we written the action as <code class="computeroutput"><span class="special">++*</span><span class="identifier">pi</span></code>, it would have executed immediately.
4631        That's because <code class="computeroutput"><span class="special">++*</span><span class="identifier">pi</span></code>
4632        is not an expression template, but <code class="computeroutput"><span class="special">++*</span><span class="identifier">val</span><span class="special">(</span><span class="identifier">pi</span><span class="special">)</span></code> is.
4633      </p>
4634<p>
4635        It can be tedious to wrap all your variables in <code class="computeroutput"><span class="identifier">ref</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">val</span><span class="special">()</span></code> in your semantic actions. Xpressive provides
4636        the <code class="computeroutput"><span class="identifier">reference</span><span class="special">&lt;&gt;</span></code>
4637        and <code class="computeroutput"><span class="identifier">value</span><span class="special">&lt;&gt;</span></code>
4638        templates to make things easier. The following table shows the equivalencies:
4639      </p>
4640<div class="table">
4641<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.t0"></a><p class="title"><b>Table 46.12. reference&lt;&gt; and value&lt;&gt;</b></p>
4642<div class="table-contents"><table class="table" summary="reference&lt;&gt; and value&lt;&gt;">
4643<colgroup>
4644<col>
4645<col>
4646</colgroup>
4647<thead><tr>
4648<th>
4649                <p>
4650                  This ...
4651                </p>
4652              </th>
4653<th>
4654                <p>
4655                  ... is equivalent to this ...
4656                </p>
4657              </th>
4658</tr></thead>
4659<tbody>
4660<tr>
4661<td>
4662                <p>
4663</p>
4664<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
4665
4666<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span></pre>
4667<p>
4668                </p>
4669              </td>
4670<td>
4671                <p>
4672</p>
4673<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
4674<span class="identifier">reference</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ri</span><span class="special">(</span><span class="identifier">i</span><span class="special">);</span>
4675<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">ri</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span></pre>
4676<p>
4677                </p>
4678              </td>
4679</tr>
4680<tr>
4681<td>
4682                <p>
4683</p>
4684<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">pi</span><span class="special">(</span><span class="keyword">new</span> <span class="keyword">int</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
4685
4686<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++*</span><span class="identifier">val</span><span class="special">(</span><span class="identifier">pi</span><span class="special">)</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span></pre>
4687<p>
4688                </p>
4689              </td>
4690<td>
4691                <p>
4692</p>
4693<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">pi</span><span class="special">(</span><span class="keyword">new</span> <span class="keyword">int</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
4694<span class="identifier">value</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">vpi</span><span class="special">(</span><span class="identifier">pi</span><span class="special">);</span>
4695<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++*</span><span class="identifier">vpi</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span></pre>
4696<p>
4697                </p>
4698              </td>
4699</tr>
4700</tbody>
4701</table></div>
4702</div>
4703<br class="table-break"><p>
4704        As you can see, when using <code class="computeroutput"><span class="identifier">reference</span><span class="special">&lt;&gt;</span></code>, you need to first declare a local
4705        variable and then declare a <code class="computeroutput"><span class="identifier">reference</span><span class="special">&lt;&gt;</span></code> to it. These two steps can be combined
4706        into one using <code class="computeroutput"><span class="identifier">local</span><span class="special">&lt;&gt;</span></code>.
4707      </p>
4708<div class="table">
4709<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.t1"></a><p class="title"><b>Table 46.13. local&lt;&gt; vs. reference&lt;&gt;</b></p>
4710<div class="table-contents"><table class="table" summary="local&lt;&gt; vs. reference&lt;&gt;">
4711<colgroup>
4712<col>
4713<col>
4714</colgroup>
4715<thead><tr>
4716<th>
4717                <p>
4718                  This ...
4719                </p>
4720              </th>
4721<th>
4722                <p>
4723                  ... is equivalent to this ...
4724                </p>
4725              </th>
4726</tr></thead>
4727<tbody><tr>
4728<td>
4729                <p>
4730</p>
4731<pre class="programlisting"><span class="identifier">local</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">i</span><span class="special">(</span><span class="number">0</span><span class="special">);</span>
4732
4733<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span></pre>
4734<p>
4735                </p>
4736              </td>
4737<td>
4738                <p>
4739</p>
4740<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
4741<span class="identifier">reference</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ri</span><span class="special">(</span><span class="identifier">i</span><span class="special">);</span>
4742<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">ri</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span></pre>
4743<p>
4744                </p>
4745              </td>
4746</tr></tbody>
4747</table></div>
4748</div>
4749<br class="table-break"><p>
4750        We can use <code class="computeroutput"><span class="identifier">local</span><span class="special">&lt;&gt;</span></code>
4751        to rewrite the above example as follows:
4752      </p>
4753<pre class="programlisting"><span class="identifier">local</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">i</span><span class="special">(</span><span class="number">0</span><span class="special">);</span>
4754<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"1!2!3?"</span><span class="special">);</span>
4755<span class="comment">// count the exciting digits, but not the</span>
4756<span class="comment">// questionable ones.</span>
4757<span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="special">+(</span> <span class="identifier">_d</span> <span class="special">[</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">]</span> <span class="special">&gt;&gt;</span> <span class="char">'!'</span> <span class="special">);</span>
4758<span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">rex</span><span class="special">);</span>
4759<span class="identifier">assert</span><span class="special">(</span> <span class="identifier">i</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">==</span> <span class="number">2</span> <span class="special">);</span>
4760</pre>
4761<p>
4762        Notice that we use <code class="computeroutput"><span class="identifier">local</span><span class="special">&lt;&gt;::</span><span class="identifier">get</span><span class="special">()</span></code> to access the value of the local variable.
4763        Also, beware that <code class="computeroutput"><span class="identifier">local</span><span class="special">&lt;&gt;</span></code>
4764        can be used to create a dangling reference, just as <code class="computeroutput"><span class="identifier">reference</span><span class="special">&lt;&gt;</span></code> can.
4765      </p>
4766<h4>
4767<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h6"></a>
4768        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.referring_to_non_local_variables"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.referring_to_non_local_variables">Referring
4769        to Non-Local Variables</a>
4770      </h4>
4771<p>
4772        In the beginning of this section, we used a regex with a semantic action
4773        to parse a string of word/integer pairs and stuff them into a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;&gt;</span></code>. That required that the map and the
4774        regex be defined together and used before either could go out of scope. What
4775        if we wanted to define the regex once and use it to fill lots of different
4776        maps? We would rather pass the map into the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
4777        algorithm rather than embed a reference to it directly in the regex object.
4778        What we can do instead is define a placeholder and use that in the semantic
4779        action instead of the map itself. Later, when we call one of the regex algorithms,
4780        we can bind the reference to an actual map object. The following code shows
4781        how.
4782      </p>
4783<pre class="programlisting"><span class="comment">// Define a placeholder for a map object:</span>
4784<span class="identifier">placeholder</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">_map</span><span class="special">;</span>
4785
4786<span class="comment">// Match a word and an integer, separated by =&gt;,</span>
4787<span class="comment">// and then stuff the result into a std::map&lt;&gt;</span>
4788<span class="identifier">sregex</span> <span class="identifier">pair</span> <span class="special">=</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">s1</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="string">"=&gt;"</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s2</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_d</span><span class="special">)</span> <span class="special">)</span>
4789    <span class="special">[</span> <span class="identifier">_map</span><span class="special">[</span><span class="identifier">s1</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">s2</span><span class="special">)</span> <span class="special">];</span>
4790
4791<span class="comment">// Match one or more word/integer pairs, separated</span>
4792<span class="comment">// by whitespace.</span>
4793<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="identifier">pair</span> <span class="special">&gt;&gt;</span> <span class="special">*(+</span><span class="identifier">_s</span> <span class="special">&gt;&gt;</span> <span class="identifier">pair</span><span class="special">);</span>
4794
4795<span class="comment">// The string to parse</span>
4796<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"aaa=&gt;1 bbb=&gt;23 ccc=&gt;456"</span><span class="special">);</span>
4797
4798<span class="comment">// Here is the actual map to fill in:</span>
4799<span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">result</span><span class="special">;</span>
4800
4801<span class="comment">// Bind the _map placeholder to the actual map</span>
4802<span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
4803<span class="identifier">what</span><span class="special">.</span><span class="identifier">let</span><span class="special">(</span> <span class="identifier">_map</span> <span class="special">=</span> <span class="identifier">result</span> <span class="special">);</span>
4804
4805<span class="comment">// Execute the match and fill in result map</span>
4806<span class="keyword">if</span><span class="special">(</span><span class="identifier">regex_match</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">))</span>
4807<span class="special">{</span>
4808    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"aaa"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4809    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"bbb"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4810    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"ccc"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4811<span class="special">}</span>
4812</pre>
4813<p>
4814        This program displays:
4815      </p>
4816<pre class="programlisting">1
481723
4818456
4819</pre>
4820<p>
4821        We use <code class="computeroutput"><span class="identifier">placeholder</span><span class="special">&lt;&gt;</span></code>
4822        here to define <code class="computeroutput"><span class="identifier">_map</span></code>, which
4823        stands in for a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;&gt;</span></code>
4824        variable. We can use the placeholder in the semantic action as if it were
4825        a map. Then, we define a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
4826        struct and bind an actual map to the placeholder with "<code class="computeroutput"><span class="identifier">what</span><span class="special">.</span><span class="identifier">let</span><span class="special">(</span> <span class="identifier">_map</span> <span class="special">=</span> <span class="identifier">result</span> <span class="special">);</span></code>". The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
4827        call behaves as if the placeholder in the semantic action had been replaced
4828        with a reference to <code class="computeroutput"><span class="identifier">result</span></code>.
4829      </p>
4830<div class="note"><table border="0" summary="Note">
4831<tr>
4832<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
4833<th align="left">Note</th>
4834</tr>
4835<tr><td align="left" valign="top"><p>
4836          Placeholders in semantic actions are not <span class="emphasis"><em>actually</em></span>
4837          replaced at runtime with references to variables. The regex object is never
4838          mutated in any way during any of the regex algorithms, so they are safe
4839          to use in multiple threads.
4840        </p></td></tr>
4841</table></div>
4842<p>
4843        The syntax for late-bound action arguments is a little different if you are
4844        using <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_iterator.html" title="Struct template regex_iterator">regex_iterator&lt;&gt;</a></code></code>
4845        or <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>.
4846        The regex iterators accept an extra constructor parameter for specifying
4847        the argument bindings. There is a <code class="computeroutput"><span class="identifier">let</span><span class="special">()</span></code> function that you can use to bind variables
4848        to their placeholders. The following code demonstrates how.
4849      </p>
4850<pre class="programlisting"><span class="comment">// Define a placeholder for a map object:</span>
4851<span class="identifier">placeholder</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">_map</span><span class="special">;</span>
4852
4853<span class="comment">// Match a word and an integer, separated by =&gt;,</span>
4854<span class="comment">// and then stuff the result into a std::map&lt;&gt;</span>
4855<span class="identifier">sregex</span> <span class="identifier">pair</span> <span class="special">=</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">s1</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_w</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="string">"=&gt;"</span> <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">s2</span><span class="special">=</span> <span class="special">+</span><span class="identifier">_d</span><span class="special">)</span> <span class="special">)</span>
4856    <span class="special">[</span> <span class="identifier">_map</span><span class="special">[</span><span class="identifier">s1</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">s2</span><span class="special">)</span> <span class="special">];</span>
4857
4858<span class="comment">// The string to parse</span>
4859<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"aaa=&gt;1 bbb=&gt;23 ccc=&gt;456"</span><span class="special">);</span>
4860
4861<span class="comment">// Here is the actual map to fill in:</span>
4862<span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">result</span><span class="special">;</span>
4863
4864<span class="comment">// Create a regex_iterator to find all the matches</span>
4865<span class="identifier">sregex_iterator</span> <span class="identifier">it</span><span class="special">(</span><span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">pair</span><span class="special">,</span> <span class="identifier">let</span><span class="special">(</span><span class="identifier">_map</span><span class="special">=</span><span class="identifier">result</span><span class="special">));</span>
4866<span class="identifier">sregex_iterator</span> <span class="identifier">end</span><span class="special">;</span>
4867
4868<span class="comment">// step through all the matches, and fill in</span>
4869<span class="comment">// the result map</span>
4870<span class="keyword">while</span><span class="special">(</span><span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">)</span>
4871    <span class="special">++</span><span class="identifier">it</span><span class="special">;</span>
4872
4873<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"aaa"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4874<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"bbb"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4875<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span><span class="special">[</span><span class="string">"ccc"</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
4876</pre>
4877<p>
4878        This program displays:
4879      </p>
4880<pre class="programlisting">1
488123
4882456
4883</pre>
4884<h3>
4885<a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.h7"></a>
4886        <span class="phrase"><a name="boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.user_defined_assertions"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.semantic_actions_and_user_defined_assertions.user_defined_assertions">User-Defined
4887        Assertions</a>
4888      </h3>
4889<p>
4890        You are probably already familiar with regular expression <span class="emphasis"><em>assertions</em></span>.
4891        In Perl, some examples are the <code class="literal">^</code> and <code class="literal">$</code>
4892        assertions, which you can use to match the beginning and end of a string,
4893        respectively. Xpressive lets you define your own assertions. A custom assertion
4894        is a contition which must be true at a point in the match in order for the
4895        match to succeed. You can check a custom assertion with xpressive's <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/check.html" title="Function template check">check()</a></code></code> function.
4896      </p>
4897<p>
4898        There are a couple of ways to define a custom assertion. The simplest is
4899        to use a function object. Let's say that you want to ensure that a sub-expression
4900        matches a sub-string that is either 3 or 6 characters long. The following
4901        struct defines such a predicate:
4902      </p>
4903<pre class="programlisting"><span class="comment">// A predicate that is true IFF a sub-match is</span>
4904<span class="comment">// either 3 or 6 characters long.</span>
4905<span class="keyword">struct</span> <span class="identifier">three_or_six</span>
4906<span class="special">{</span>
4907    <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ssub_match</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">sub</span><span class="special">)</span> <span class="keyword">const</span>
4908    <span class="special">{</span>
4909        <span class="keyword">return</span> <span class="identifier">sub</span><span class="special">.</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span> <span class="special">||</span> <span class="identifier">sub</span><span class="special">.</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">6</span><span class="special">;</span>
4910    <span class="special">}</span>
4911<span class="special">};</span>
4912</pre>
4913<p>
4914        You can use this predicate within a regular expression as follows:
4915      </p>
4916<pre class="programlisting"><span class="comment">// match words of 3 characters or 6 characters.</span>
4917<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">bow</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">_w</span> <span class="special">&gt;&gt;</span> <span class="identifier">eow</span><span class="special">)[</span> <span class="identifier">check</span><span class="special">(</span><span class="identifier">three_or_six</span><span class="special">())</span> <span class="special">]</span> <span class="special">;</span>
4918</pre>
4919<p>
4920        The above regular expression will find whole words that are either 3 or 6
4921        characters long. The <code class="computeroutput"><span class="identifier">three_or_six</span></code>
4922        predicate accepts a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/sub_match.html" title="Struct template sub_match">sub_match&lt;&gt;</a></code></code>
4923        that refers back to the part of the string matched by the sub-expression
4924        to which the custom assertion is attached.
4925      </p>
4926<div class="note"><table border="0" summary="Note">
4927<tr>
4928<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
4929<th align="left">Note</th>
4930</tr>
4931<tr><td align="left" valign="top"><p>
4932          The custom assertion participates in determining whether the match succeeds
4933          or fails. Unlike actions, which execute lazily, custom assertions execute
4934          immediately while the regex engine is searching for a match.
4935        </p></td></tr>
4936</table></div>
4937<p>
4938        Custom assertions can also be defined inline using the same syntax as for
4939        semantic actions. Below is the same custom assertion written inline:
4940      </p>
4941<pre class="programlisting"><span class="comment">// match words of 3 characters or 6 characters.</span>
4942<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">bow</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">_w</span> <span class="special">&gt;&gt;</span> <span class="identifier">eow</span><span class="special">)[</span> <span class="identifier">check</span><span class="special">(</span><span class="identifier">length</span><span class="special">(</span><span class="identifier">_</span><span class="special">)==</span><span class="number">3</span> <span class="special">||</span> <span class="identifier">length</span><span class="special">(</span><span class="identifier">_</span><span class="special">)==</span><span class="number">6</span><span class="special">)</span> <span class="special">]</span> <span class="special">;</span>
4943</pre>
4944<p>
4945        In the above, <code class="computeroutput"><span class="identifier">length</span><span class="special">()</span></code>
4946        is a lazy function that calls the <code class="computeroutput"><span class="identifier">length</span><span class="special">()</span></code> member function of its argument, and <code class="computeroutput"><span class="identifier">_</span></code> is a placeholder that receives the <code class="computeroutput"><span class="identifier">sub_match</span></code>.
4947      </p>
4948<p>
4949        Once you get the hang of writing custom assertions inline, they can be very
4950        powerful. For example, you can write a regular expression that only matches
4951        valid dates (for some suitably liberal definition of the term <span class="quote">“<span class="quote">valid</span>”</span>).
4952      </p>
4953<pre class="programlisting"><span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">days_per_month</span><span class="special">[]</span> <span class="special">=</span>
4954    <span class="special">{</span><span class="number">31</span><span class="special">,</span> <span class="number">29</span><span class="special">,</span> <span class="number">31</span><span class="special">,</span> <span class="number">30</span><span class="special">,</span> <span class="number">31</span><span class="special">,</span> <span class="number">30</span><span class="special">,</span> <span class="number">31</span><span class="special">,</span> <span class="number">31</span><span class="special">,</span> <span class="number">30</span><span class="special">,</span> <span class="number">31</span><span class="special">,</span> <span class="number">31</span><span class="special">,</span> <span class="number">31</span><span class="special">};</span>
4955
4956<span class="identifier">mark_tag</span> <span class="identifier">month</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">day</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
4957<span class="comment">// find a valid date of the form month/day/year.</span>
4958<span class="identifier">sregex</span> <span class="identifier">date</span> <span class="special">=</span>
4959    <span class="special">(</span>
4960        <span class="comment">// Month must be between 1 and 12 inclusive</span>
4961        <span class="special">(</span><span class="identifier">month</span><span class="special">=</span> <span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="special">!</span><span class="identifier">_d</span><span class="special">)</span>     <span class="special">[</span> <span class="identifier">check</span><span class="special">(</span><span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">)</span> <span class="special">&gt;=</span> <span class="number">1</span>
4962                                    <span class="special">&amp;&amp;</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">)</span> <span class="special">&lt;=</span> <span class="number">12</span><span class="special">)</span> <span class="special">]</span>
4963    <span class="special">&gt;&gt;</span>  <span class="char">'/'</span>
4964        <span class="comment">// Day must be between 1 and 31 inclusive</span>
4965    <span class="special">&gt;&gt;</span>  <span class="special">(</span><span class="identifier">day</span><span class="special">=</span>   <span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="special">!</span><span class="identifier">_d</span><span class="special">)</span>     <span class="special">[</span> <span class="identifier">check</span><span class="special">(</span><span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">)</span> <span class="special">&gt;=</span> <span class="number">1</span>
4966                                    <span class="special">&amp;&amp;</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">)</span> <span class="special">&lt;=</span> <span class="number">31</span><span class="special">)</span> <span class="special">]</span>
4967    <span class="special">&gt;&gt;</span>  <span class="char">'/'</span>
4968        <span class="comment">// Only consider years between 1970 and 2038</span>
4969    <span class="special">&gt;&gt;</span>  <span class="special">(</span><span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="identifier">_d</span><span class="special">)</span> <span class="special">[</span> <span class="identifier">check</span><span class="special">(</span><span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">)</span> <span class="special">&gt;=</span> <span class="number">1970</span>
4970                                    <span class="special">&amp;&amp;</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">_</span><span class="special">)</span> <span class="special">&lt;=</span> <span class="number">2038</span><span class="special">)</span> <span class="special">]</span>
4971    <span class="special">)</span>
4972    <span class="comment">// Ensure the month actually has that many days!</span>
4973    <span class="special">[</span> <span class="identifier">check</span><span class="special">(</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">days_per_month</span><span class="special">)[</span><span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">month</span><span class="special">)-</span><span class="number">1</span><span class="special">]</span> <span class="special">&gt;=</span> <span class="identifier">as</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">day</span><span class="special">)</span> <span class="special">)</span> <span class="special">]</span>
4974<span class="special">;</span>
4975
4976<span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
4977<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span><span class="string">"99/99/9999 2/30/2006 2/28/2006"</span><span class="special">);</span>
4978
4979<span class="keyword">if</span><span class="special">(</span><span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">date</span><span class="special">))</span>
4980<span class="special">{</span>
4981    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
4982<span class="special">}</span>
4983</pre>
4984<p>
4985        The above program prints out the following:
4986      </p>
4987<pre class="programlisting">2/28/2006
4988</pre>
4989<p>
4990        Notice how the inline custom assertions are used to range-check the values
4991        for the month, day and year. The regular expression doesn't match <code class="computeroutput"><span class="string">"99/99/9999"</span></code> or <code class="computeroutput"><span class="string">"2/30/2006"</span></code>
4992        because they are not valid dates. (There is no 99th month, and February doesn't
4993        have 30 days.)
4994      </p>
4995</div>
4996<div class="section">
4997<div class="titlepage"><div><div><h3 class="title">
4998<a name="boost_xpressive.user_s_guide.symbol_tables_and_attributes"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.symbol_tables_and_attributes" title="Symbol Tables and Attributes">Symbol
4999      Tables and Attributes</a>
5000</h3></div></div></div>
5001<h3>
5002<a name="boost_xpressive.user_s_guide.symbol_tables_and_attributes.h0"></a>
5003        <span class="phrase"><a name="boost_xpressive.user_s_guide.symbol_tables_and_attributes.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.symbol_tables_and_attributes.overview">Overview</a>
5004      </h3>
5005<p>
5006        Symbol tables can be built into xpressive regular expressions with just a
5007        <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;&gt;</span></code>.
5008        The map keys are the strings to be matched and the map values are the data
5009        to be returned to your semantic action. Xpressive attributes, named <code class="computeroutput"><span class="identifier">a1</span></code>, <code class="computeroutput"><span class="identifier">a2</span></code>,
5010        through <code class="computeroutput"><span class="identifier">a9</span></code>, hold the value
5011        corresponding to a matching key so that it can be used in a semantic action.
5012        A default value can be specified for an attribute if a symbol is not found.
5013      </p>
5014<h3>
5015<a name="boost_xpressive.user_s_guide.symbol_tables_and_attributes.h1"></a>
5016        <span class="phrase"><a name="boost_xpressive.user_s_guide.symbol_tables_and_attributes.symbol_tables"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.symbol_tables_and_attributes.symbol_tables">Symbol
5017        Tables</a>
5018      </h3>
5019<p>
5020        An xpressive symbol table is just a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;&gt;</span></code>,
5021        where the key is a string type and the value can be anything. For example,
5022        the following regular expression matches a key from map1 and assigns the
5023        corresponding value to the attribute <code class="computeroutput"><span class="identifier">a1</span></code>.
5024        Then, in the semantic action, it assigns the value stored in attribute <code class="computeroutput"><span class="identifier">a1</span></code> to an integer result.
5025      </p>
5026<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
5027<span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">map1</span><span class="special">;</span>
5028<span class="comment">// ... (fill the map)</span>
5029<span class="identifier">sregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="special">(</span> <span class="identifier">a1</span> <span class="special">=</span> <span class="identifier">map1</span> <span class="special">)</span> <span class="special">[</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">a1</span> <span class="special">];</span>
5030</pre>
5031<p>
5032        Consider the following example code, which translates number names into integers.
5033        It is described below.
5034      </p>
5035<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
5036<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
5037<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5038<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">regex_actions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5039<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
5040
5041<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
5042<span class="special">{</span>
5043    <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">number_map</span><span class="special">;</span>
5044    <span class="identifier">number_map</span><span class="special">[</span><span class="string">"one"</span><span class="special">]</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
5045    <span class="identifier">number_map</span><span class="special">[</span><span class="string">"two"</span><span class="special">]</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span>
5046    <span class="identifier">number_map</span><span class="special">[</span><span class="string">"three"</span><span class="special">]</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
5047    <span class="comment">// Match a string from number_map</span>
5048    <span class="comment">// and store the integer value in 'result'</span>
5049    <span class="comment">// if not found, store -1 in 'result'</span>
5050    <span class="keyword">int</span> <span class="identifier">result</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
5051    <span class="identifier">cregex</span> <span class="identifier">rx</span> <span class="special">=</span> <span class="special">((</span><span class="identifier">a1</span> <span class="special">=</span> <span class="identifier">number_map</span> <span class="special">)</span> <span class="special">|</span> <span class="special">*</span><span class="identifier">_</span><span class="special">)</span>
5052        <span class="special">[</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">a1</span> <span class="special">|</span> <span class="special">-</span><span class="number">1</span><span class="special">)];</span>
5053
5054    <span class="identifier">regex_match</span><span class="special">(</span><span class="string">"three"</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">);</span>
5055    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
5056    <span class="identifier">regex_match</span><span class="special">(</span><span class="string">"two"</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">);</span>
5057    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
5058    <span class="identifier">regex_match</span><span class="special">(</span><span class="string">"stuff"</span><span class="special">,</span> <span class="identifier">rx</span><span class="special">);</span>
5059    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">result</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
5060    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
5061<span class="special">}</span>
5062</pre>
5063<p>
5064        This program prints the following:
5065      </p>
5066<pre class="programlisting">3
50672
5068-1
5069</pre>
5070<p>
5071        First the program builds a number map, with number names as string keys and
5072        the corresponding integers as values. Then it constructs a static regular
5073        expression using an attribute <code class="computeroutput"><span class="identifier">a1</span></code>
5074        to represent the result of the symbol table lookup. In the semantic action,
5075        the attribute is assigned to an integer variable <code class="computeroutput"><span class="identifier">result</span></code>.
5076        If the symbol was not found, a default value of <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code> is assigned to <code class="computeroutput"><span class="identifier">result</span></code>.
5077        A wildcard, <code class="computeroutput"><span class="special">*</span><span class="identifier">_</span></code>,
5078        makes sure the regex matches even if the symbol is not found.
5079      </p>
5080<p>
5081        A more complete version of this example can be found in <code class="literal">libs/xpressive/example/numbers.cpp</code><a href="#ftn.boost_xpressive.user_s_guide.symbol_tables_and_attributes.f0" class="footnote" name="boost_xpressive.user_s_guide.symbol_tables_and_attributes.f0"><sup class="footnote">[37]</sup></a>. It translates number names up to "nine hundred ninety nine
5082        million nine hundred ninety nine thousand nine hundred ninety nine"
5083        along with some special number names like "dozen".
5084      </p>
5085<p>
5086        Symbol table matches are case sensitive by default, but they can be made
5087        case-insensitive by enclosing the expression in <code class="computeroutput"><span class="identifier">icase</span><span class="special">()</span></code>.
5088      </p>
5089<h3>
5090<a name="boost_xpressive.user_s_guide.symbol_tables_and_attributes.h2"></a>
5091        <span class="phrase"><a name="boost_xpressive.user_s_guide.symbol_tables_and_attributes.attributes"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.symbol_tables_and_attributes.attributes">Attributes</a>
5092      </h3>
5093<p>
5094        Up to nine attributes can be used in a regular expression. They are named
5095        <code class="computeroutput"><span class="identifier">a1</span></code>, <code class="computeroutput"><span class="identifier">a2</span></code>,
5096        ..., <code class="computeroutput"><span class="identifier">a9</span></code> in the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span></code> namespace. The attribute type
5097        is the same as the second component of the map that is assigned to it. A
5098        default value for an attribute can be specified in a semantic action with
5099        the syntax <code class="computeroutput"><span class="special">(</span><span class="identifier">a1</span>
5100        <span class="special">|</span> <em class="replaceable"><code>default-value</code></em><span class="special">)</span></code>.
5101      </p>
5102<p>
5103        Attributes are properly scoped, so you can do crazy things like: <code class="computeroutput"><span class="special">(</span> <span class="special">(</span><span class="identifier">a1</span><span class="special">=</span><span class="identifier">sym1</span><span class="special">)</span>
5104        <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">a1</span><span class="special">=</span><span class="identifier">sym2</span><span class="special">)[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)=</span><span class="identifier">a1</span><span class="special">]</span> <span class="special">)[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">y</span><span class="special">)=</span><span class="identifier">a1</span><span class="special">]</span></code>. The
5105        inner semantic action sees the inner <code class="computeroutput"><span class="identifier">a1</span></code>,
5106        and the outer semantic action sees the outer one. They can even have different
5107        types.
5108      </p>
5109<div class="note"><table border="0" summary="Note">
5110<tr>
5111<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
5112<th align="left">Note</th>
5113</tr>
5114<tr><td align="left" valign="top"><p>
5115          Xpressive builds a hidden ternary search trie from the map so it can search
5116          quickly. If BOOST_DISABLE_THREADS is defined, the hidden ternary search
5117          trie "self adjusts", so after each search it restructures itself
5118          to improve the efficiency of future searches based on the frequency of
5119          previous searches.
5120        </p></td></tr>
5121</table></div>
5122</div>
5123<div class="section">
5124<div class="titlepage"><div><div><h3 class="title">
5125<a name="boost_xpressive.user_s_guide.localization_and_regex_traits"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits" title="Localization and Regex Traits">Localization
5126      and Regex Traits</a>
5127</h3></div></div></div>
5128<h3>
5129<a name="boost_xpressive.user_s_guide.localization_and_regex_traits.h0"></a>
5130        <span class="phrase"><a name="boost_xpressive.user_s_guide.localization_and_regex_traits.overview"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits.overview">Overview</a>
5131      </h3>
5132<p>
5133        Matching a regular expression against a string often requires locale-dependent
5134        information. For example, how are case-insensitive comparisons performed?
5135        The locale-sensitive behavior is captured in a traits class. xpressive provides
5136        three traits class templates: <code class="computeroutput"><span class="identifier">cpp_regex_traits</span><span class="special">&lt;&gt;</span></code>, <code class="computeroutput"><span class="identifier">c_regex_traits</span><span class="special">&lt;&gt;</span></code> and <code class="computeroutput"><span class="identifier">null_regex_traits</span><span class="special">&lt;&gt;</span></code>. The first wraps a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span></code>,
5137        the second wraps the global C locale, and the third is a stub traits type
5138        for use when searching non-character data. All traits templates conform to
5139        the <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.concepts.traits_requirements">Regex
5140        Traits Concept</a>.
5141      </p>
5142<h3>
5143<a name="boost_xpressive.user_s_guide.localization_and_regex_traits.h1"></a>
5144        <span class="phrase"><a name="boost_xpressive.user_s_guide.localization_and_regex_traits.setting_the_default_regex_trait"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits.setting_the_default_regex_trait">Setting
5145        the Default Regex Trait</a>
5146      </h3>
5147<p>
5148        By default, xpressive uses <code class="computeroutput"><span class="identifier">cpp_regex_traits</span><span class="special">&lt;&gt;</span></code> for all patterns. This causes all
5149        regex objects to use the global <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span></code>.
5150        If you compile with <code class="computeroutput"><span class="identifier">BOOST_XPRESSIVE_USE_C_TRAITS</span></code>
5151        defined, then xpressive will use <code class="computeroutput"><span class="identifier">c_regex_traits</span><span class="special">&lt;&gt;</span></code> by default.
5152      </p>
5153<h3>
5154<a name="boost_xpressive.user_s_guide.localization_and_regex_traits.h2"></a>
5155        <span class="phrase"><a name="boost_xpressive.user_s_guide.localization_and_regex_traits.using_custom_traits_with_dynamic_regexes"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits.using_custom_traits_with_dynamic_regexes">Using
5156        Custom Traits with Dynamic Regexes</a>
5157      </h3>
5158<p>
5159        To create a dynamic regex that uses a custom traits object, you must use
5160        <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_compiler.html" title="Struct template regex_compiler">regex_compiler&lt;&gt;</a></code></code>.
5161        The basic steps are shown in the following example:
5162      </p>
5163<pre class="programlisting"><span class="comment">// Declare a regex_compiler that uses the global C locale</span>
5164<span class="identifier">regex_compiler</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*,</span> <span class="identifier">c_regex_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">crxcomp</span><span class="special">;</span>
5165<span class="identifier">cregex</span> <span class="identifier">crx</span> <span class="special">=</span> <span class="identifier">crxcomp</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"\\w+"</span> <span class="special">);</span>
5166
5167<span class="comment">// Declare a regex_compiler that uses a custom std::locale</span>
5168<span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span> <span class="identifier">loc</span> <span class="special">=</span> <span class="comment">/* ... create a locale here ... */</span><span class="special">;</span>
5169<span class="identifier">regex_compiler</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*,</span> <span class="identifier">cpp_regex_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">cpprxcomp</span><span class="special">(</span><span class="identifier">loc</span><span class="special">);</span>
5170<span class="identifier">cregex</span> <span class="identifier">cpprx</span> <span class="special">=</span> <span class="identifier">cpprxcomp</span><span class="special">.</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"\\w+"</span> <span class="special">);</span>
5171</pre>
5172<p>
5173        The <code class="computeroutput"><span class="identifier">regex_compiler</span></code> objects
5174        act as regex factories. Once they have been imbued with a locale, every regex
5175        object they create will use that locale.
5176      </p>
5177<h3>
5178<a name="boost_xpressive.user_s_guide.localization_and_regex_traits.h3"></a>
5179        <span class="phrase"><a name="boost_xpressive.user_s_guide.localization_and_regex_traits.using_custom_traits_with_static_regexes"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits.using_custom_traits_with_static_regexes">Using
5180        Custom Traits with Static Regexes</a>
5181      </h3>
5182<p>
5183        If you want a particular static regex to use a different set of traits, you
5184        can use the special <code class="computeroutput"><span class="identifier">imbue</span><span class="special">()</span></code> pattern modifier. For instance:
5185      </p>
5186<pre class="programlisting"><span class="comment">// Define a regex that uses the global C locale</span>
5187<span class="identifier">c_regex_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">ctraits</span><span class="special">;</span>
5188<span class="identifier">sregex</span> <span class="identifier">crx</span> <span class="special">=</span> <span class="identifier">imbue</span><span class="special">(</span><span class="identifier">ctraits</span><span class="special">)(</span> <span class="special">+</span><span class="identifier">_w</span> <span class="special">);</span>
5189
5190<span class="comment">// Define a regex that uses a customized std::locale</span>
5191<span class="identifier">std</span><span class="special">::</span><span class="identifier">locale</span> <span class="identifier">loc</span> <span class="special">=</span> <span class="comment">/* ... create a locale here ... */</span><span class="special">;</span>
5192<span class="identifier">cpp_regex_traits</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">cpptraits</span><span class="special">(</span><span class="identifier">loc</span><span class="special">);</span>
5193<span class="identifier">sregex</span> <span class="identifier">cpprx1</span> <span class="special">=</span> <span class="identifier">imbue</span><span class="special">(</span><span class="identifier">cpptraits</span><span class="special">)(</span> <span class="special">+</span><span class="identifier">_w</span> <span class="special">);</span>
5194
5195<span class="comment">// A shorthand for above</span>
5196<span class="identifier">sregex</span> <span class="identifier">cpprx2</span> <span class="special">=</span> <span class="identifier">imbue</span><span class="special">(</span><span class="identifier">loc</span><span class="special">)(</span> <span class="special">+</span><span class="identifier">_w</span> <span class="special">);</span>
5197</pre>
5198<p>
5199        The <code class="computeroutput"><span class="identifier">imbue</span><span class="special">()</span></code>
5200        pattern modifier must wrap the entire pattern. It is an error to <code class="computeroutput"><span class="identifier">imbue</span></code> only part of a static regex. For
5201        example:
5202      </p>
5203<pre class="programlisting"><span class="comment">// ERROR! Cannot imbue() only part of a regex</span>
5204<span class="identifier">sregex</span> <span class="identifier">error</span> <span class="special">=</span> <span class="identifier">_w</span> <span class="special">&gt;&gt;</span> <span class="identifier">imbue</span><span class="special">(</span><span class="identifier">loc</span><span class="special">)(</span> <span class="identifier">_w</span> <span class="special">);</span>
5205</pre>
5206<h3>
5207<a name="boost_xpressive.user_s_guide.localization_and_regex_traits.h4"></a>
5208        <span class="phrase"><a name="boost_xpressive.user_s_guide.localization_and_regex_traits.searching_non_character_data_with__literal_null_regex_traits__literal_"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.localization_and_regex_traits.searching_non_character_data_with__literal_null_regex_traits__literal_">Searching
5209        Non-Character Data With <code class="literal">null_regex_traits</code></a>
5210      </h3>
5211<p>
5212        With xpressive static regexes, you are not limitted to searching for patterns
5213        in character sequences. You can search for patterns in raw bytes, integers,
5214        or anything that conforms to the <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.concepts.chart_requirements">Char
5215        Concept</a>. The <code class="computeroutput"><span class="identifier">null_regex_traits</span><span class="special">&lt;&gt;</span></code> makes it simple. It is a stub implementation
5216        of the <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.concepts.traits_requirements">Regex
5217        Traits Concept</a>. It recognizes no character classes and does no case-sensitive
5218        mappings.
5219      </p>
5220<p>
5221        For example, with <code class="computeroutput"><span class="identifier">null_regex_traits</span><span class="special">&lt;&gt;</span></code>, you can write a static regex to
5222        find a pattern in a sequence of integers as follows:
5223      </p>
5224<pre class="programlisting"><span class="comment">// some integral data to search</span>
5225<span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">data</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">};</span>
5226
5227<span class="comment">// create a null_regex_traits&lt;&gt; object for searching integers ...</span>
5228<span class="identifier">null_regex_traits</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">nul</span><span class="special">;</span>
5229
5230<span class="comment">// imbue a regex object with the null_regex_traits ...</span>
5231<span class="identifier">basic_regex</span><span class="special">&lt;</span><span class="keyword">int</span> <span class="keyword">const</span> <span class="special">*&gt;</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="identifier">imbue</span><span class="special">(</span><span class="identifier">nul</span><span class="special">)(</span><span class="number">1</span> <span class="special">&gt;&gt;</span> <span class="special">+((</span><span class="identifier">set</span><span class="special">=</span> <span class="number">2</span><span class="special">,</span><span class="number">3</span><span class="special">)</span> <span class="special">|</span> <span class="number">4</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="number">5</span><span class="special">);</span>
5232<span class="identifier">match_results</span><span class="special">&lt;</span><span class="keyword">int</span> <span class="keyword">const</span> <span class="special">*&gt;</span> <span class="identifier">what</span><span class="special">;</span>
5233
5234<span class="comment">// search for the pattern in the array of integers ...</span>
5235<span class="identifier">regex_search</span><span class="special">(</span><span class="identifier">data</span><span class="special">,</span> <span class="identifier">data</span> <span class="special">+</span> <span class="number">7</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">rex</span><span class="special">);</span>
5236
5237<span class="identifier">assert</span><span class="special">(</span><span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">].</span><span class="identifier">matched</span><span class="special">);</span>
5238<span class="identifier">assert</span><span class="special">(*</span><span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">].</span><span class="identifier">first</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
5239<span class="identifier">assert</span><span class="special">(*</span><span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">].</span><span class="identifier">second</span> <span class="special">==</span> <span class="number">6</span><span class="special">);</span>
5240</pre>
5241</div>
5242<div class="section">
5243<div class="titlepage"><div><div><h3 class="title">
5244<a name="boost_xpressive.user_s_guide.tips_n_tricks"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks" title="Tips 'N Tricks">Tips 'N Tricks</a>
5245</h3></div></div></div>
5246<p>
5247        Squeeze the most performance out of xpressive with these tips and tricks.
5248      </p>
5249<h3>
5250<a name="boost_xpressive.user_s_guide.tips_n_tricks.h0"></a>
5251        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.compile_patterns_once_and_reuse_them"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.compile_patterns_once_and_reuse_them">Compile
5252        Patterns Once And Reuse Them</a>
5253      </h3>
5254<p>
5255        Compiling a regex (dynamic or static) is <span class="emphasis"><em>far</em></span> more expensive
5256        than executing a match or search. If you have the option, prefer to compile
5257        a pattern into a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
5258        object once and reuse it rather than recreating it over and over.
5259      </p>
5260<p>
5261        Since <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
5262        objects are not mutated by any of the regex algorithms, they are completely
5263        thread-safe once their initialization (and that of any grammars of which
5264        they are members) completes. The easiest way to reuse your patterns is to
5265        simply make your <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>
5266        objects "static const".
5267      </p>
5268<h3>
5269<a name="boost_xpressive.user_s_guide.tips_n_tricks.h1"></a>
5270        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.reuse__literal__classname_alt__boost__xpressive__match_results__match_results_lt__gt___classname___literal__objects"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.reuse__literal__classname_alt__boost__xpressive__match_results__match_results_lt__gt___classname___literal__objects">Reuse
5271        match_results&lt;&gt;
5272        Objects</a>
5273      </h3>
5274<p>
5275        The <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
5276        object caches dynamically allocated memory. For this reason, it is far better
5277        to reuse the same <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
5278        object if you have to do many regex searches.
5279      </p>
5280<p>
5281        Caveat: <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
5282        objects are not thread-safe, so don't go wild reusing them across threads.
5283      </p>
5284<h3>
5285<a name="boost_xpressive.user_s_guide.tips_n_tricks.h2"></a>
5286        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.prefer_algorithms_that_take_a__literal__classname_alt__boost__xpressive__match_results__match_results_lt__gt___classname___literal__object"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.prefer_algorithms_that_take_a__literal__classname_alt__boost__xpressive__match_results__match_results_lt__gt___classname___literal__object">Prefer
5287        Algorithms That Take A match_results&lt;&gt;
5288        Object</a>
5289      </h3>
5290<p>
5291        This is a corollary to the previous tip. If you are doing multiple searches,
5292        you should prefer the regex algorithms that accept a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
5293        object over the ones that don't, and you should reuse the same <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
5294        object each time. If you don't provide a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>
5295        object, a temporary one will be created for you and discarded when the algorithm
5296        returns. Any memory cached in the object will be deallocated and will have
5297        to be reallocated the next time.
5298      </p>
5299<h3>
5300<a name="boost_xpressive.user_s_guide.tips_n_tricks.h3"></a>
5301        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.prefer_algorithms_that_accept_iterator_ranges_over_null_terminated_strings"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.prefer_algorithms_that_accept_iterator_ranges_over_null_terminated_strings">Prefer
5302        Algorithms That Accept Iterator Ranges Over Null-Terminated Strings</a>
5303      </h3>
5304<p>
5305        xpressive provides overloads of the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_match.html" title="Function regex_match">regex_match()</a></code></code>
5306        and <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_search.html" title="Function regex_search">regex_search()</a></code></code>
5307        algorithms that operate on C-style null-terminated strings. You should prefer
5308        the overloads that take iterator ranges. When you pass a null-terminated
5309        string to a regex algorithm, the end iterator is calculated immediately by
5310        calling <code class="computeroutput"><span class="identifier">strlen</span></code>. If you already
5311        know the length of the string, you can avoid this overhead by calling the
5312        regex algorithms with a <code class="computeroutput"><span class="special">[</span><span class="identifier">begin</span><span class="special">,</span> <span class="identifier">end</span><span class="special">)</span></code>
5313        pair.
5314      </p>
5315<h3>
5316<a name="boost_xpressive.user_s_guide.tips_n_tricks.h4"></a>
5317        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.use_static_regexes"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.use_static_regexes">Use
5318        Static Regexes</a>
5319      </h3>
5320<p>
5321        On average, static regexes execute about 10 to 15% faster than their dynamic
5322        counterparts. It's worth familiarizing yourself with the static regex dialect.
5323      </p>
5324<h3>
5325<a name="boost_xpressive.user_s_guide.tips_n_tricks.h5"></a>
5326        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.understand__literal_syntax_option_type__optimize__literal_"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.understand__literal_syntax_option_type__optimize__literal_">Understand
5327        <code class="literal">syntax_option_type::optimize</code></a>
5328      </h3>
5329<p>
5330        The <code class="computeroutput"><span class="identifier">optimize</span></code> flag tells the
5331        regex compiler to spend some extra time analyzing the pattern. It can cause
5332        some patterns to execute faster, but it increases the time to compile the
5333        pattern, and often increases the amount of memory consumed by the pattern.
5334        If you plan to reuse your pattern, <code class="computeroutput"><span class="identifier">optimize</span></code>
5335        is usually a win. If you will only use the pattern once, don't use <code class="computeroutput"><span class="identifier">optimize</span></code>.
5336      </p>
5337<h2>
5338<a name="boost_xpressive.user_s_guide.tips_n_tricks.h6"></a>
5339        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.common_pitfalls"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.common_pitfalls">Common
5340        Pitfalls</a>
5341      </h2>
5342<p>
5343        Keep the following tips in mind to avoid stepping in potholes with xpressive.
5344      </p>
5345<h3>
5346<a name="boost_xpressive.user_s_guide.tips_n_tricks.h7"></a>
5347        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.create_grammars_on_a_single_thread"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.create_grammars_on_a_single_thread">Create
5348        Grammars On A Single Thread</a>
5349      </h3>
5350<p>
5351        With static regexes, you can create grammars by nesting regexes inside one
5352        another. When compiling the outer regex, both the outer and inner regex objects,
5353        and all the regex objects to which they refer either directly or indirectly,
5354        are modified. For this reason, it's dangerous for global regex objects to
5355        participate in grammars. It's best to build regex grammars from a single
5356        thread. Once built, the resulting regex grammar can be executed from multiple
5357        threads without problems.
5358      </p>
5359<h3>
5360<a name="boost_xpressive.user_s_guide.tips_n_tricks.h8"></a>
5361        <span class="phrase"><a name="boost_xpressive.user_s_guide.tips_n_tricks.beware_nested_quantifiers"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.tips_n_tricks.beware_nested_quantifiers">Beware
5362        Nested Quantifiers</a>
5363      </h3>
5364<p>
5365        This is a pitfall common to many regular expression engines. Some patterns
5366        can cause exponentially bad performance. Often these patterns involve one
5367        quantified term nested withing another quantifier, such as <code class="computeroutput"><span class="string">"(a*)*"</span></code>, although in many cases,
5368        the problem is harder to spot. Beware of patterns that have nested quantifiers.
5369      </p>
5370</div>
5371<div class="section">
5372<div class="titlepage"><div><div><h3 class="title">
5373<a name="boost_xpressive.user_s_guide.concepts"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.concepts" title="Concepts">Concepts</a>
5374</h3></div></div></div>
5375<h3>
5376<a name="boost_xpressive.user_s_guide.concepts.h0"></a>
5377        <span class="phrase"><a name="boost_xpressive.user_s_guide.concepts.chart_requirements"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.concepts.chart_requirements">CharT
5378        requirements</a>
5379      </h3>
5380<p>
5381        If type <code class="computeroutput"><span class="identifier">BidiIterT</span></code> is used
5382        as a template argument to <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>,
5383        then <code class="computeroutput"><span class="identifier">CharT</span></code> is <code class="computeroutput"><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">BidiIterT</span><span class="special">&gt;::</span><span class="identifier">value_type</span></code>. Type <code class="computeroutput"><span class="identifier">CharT</span></code>
5384        must have a trivial default constructor, copy constructor, assignment operator,
5385        and destructor. In addition the following requirements must be met for objects;
5386        <code class="computeroutput"><span class="identifier">c</span></code> of type <code class="computeroutput"><span class="identifier">CharT</span></code>,
5387        <code class="computeroutput"><span class="identifier">c1</span></code> and <code class="computeroutput"><span class="identifier">c2</span></code>
5388        of type <code class="computeroutput"><span class="identifier">CharT</span> <span class="keyword">const</span></code>,
5389        and <code class="computeroutput"><span class="identifier">i</span></code> of type <code class="computeroutput"><span class="keyword">int</span></code>:
5390      </p>
5391<div class="table">
5392<a name="boost_xpressive.user_s_guide.concepts.t0"></a><p class="title"><b>Table 46.14. CharT Requirements</b></p>
5393<div class="table-contents"><table class="table" summary="CharT Requirements">
5394<colgroup>
5395<col>
5396<col>
5397<col>
5398</colgroup>
5399<thead><tr>
5400<th>
5401                <p>
5402                  <span class="bold"><strong>Expression</strong></span>
5403                </p>
5404              </th>
5405<th>
5406                <p>
5407                  <span class="bold"><strong>Return type</strong></span>
5408                </p>
5409              </th>
5410<th>
5411                <p>
5412                  <span class="bold"><strong>Assertion / Note / Pre- / Post-condition</strong></span>
5413                </p>
5414              </th>
5415</tr></thead>
5416<tbody>
5417<tr>
5418<td>
5419                <p>
5420                  <code class="computeroutput"><span class="identifier">CharT</span> <span class="identifier">c</span></code>
5421                </p>
5422              </td>
5423<td>
5424                <p>
5425                  <code class="computeroutput"><span class="identifier">CharT</span></code>
5426                </p>
5427              </td>
5428<td>
5429                <p>
5430                  Default constructor (must be trivial).
5431                </p>
5432              </td>
5433</tr>
5434<tr>
5435<td>
5436                <p>
5437                  <code class="computeroutput"><span class="identifier">CharT</span> <span class="identifier">c</span><span class="special">(</span><span class="identifier">c1</span><span class="special">)</span></code>
5438                </p>
5439              </td>
5440<td>
5441                <p>
5442                  <code class="computeroutput"><span class="identifier">CharT</span></code>
5443                </p>
5444              </td>
5445<td>
5446                <p>
5447                  Copy constructor (must be trivial).
5448                </p>
5449              </td>
5450</tr>
5451<tr>
5452<td>
5453                <p>
5454                  <code class="computeroutput"><span class="identifier">c1</span> <span class="special">=</span>
5455                  <span class="identifier">c2</span></code>
5456                </p>
5457              </td>
5458<td>
5459                <p>
5460                  <code class="computeroutput"><span class="identifier">CharT</span></code>
5461                </p>
5462              </td>
5463<td>
5464                <p>
5465                  Assignment operator (must be trivial).
5466                </p>
5467              </td>
5468</tr>
5469<tr>
5470<td>
5471                <p>
5472                  <code class="computeroutput"><span class="identifier">c1</span> <span class="special">==</span>
5473                  <span class="identifier">c2</span></code>
5474                </p>
5475              </td>
5476<td>
5477                <p>
5478                  <code class="computeroutput"><span class="keyword">bool</span></code>
5479                </p>
5480              </td>
5481<td>
5482                <p>
5483                  <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">c1</span></code> has the same value as <code class="computeroutput"><span class="identifier">c2</span></code>.
5484                </p>
5485              </td>
5486</tr>
5487<tr>
5488<td>
5489                <p>
5490                  <code class="computeroutput"><span class="identifier">c1</span> <span class="special">!=</span>
5491                  <span class="identifier">c2</span></code>
5492                </p>
5493              </td>
5494<td>
5495                <p>
5496                  <code class="computeroutput"><span class="keyword">bool</span></code>
5497                </p>
5498              </td>
5499<td>
5500                <p>
5501                  <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">c1</span></code> and <code class="computeroutput"><span class="identifier">c2</span></code>
5502                  are not equal.
5503                </p>
5504              </td>
5505</tr>
5506<tr>
5507<td>
5508                <p>
5509                  <code class="computeroutput"><span class="identifier">c1</span> <span class="special">&lt;</span>
5510                  <span class="identifier">c2</span></code>
5511                </p>
5512              </td>
5513<td>
5514                <p>
5515                  <code class="computeroutput"><span class="keyword">bool</span></code>
5516                </p>
5517              </td>
5518<td>
5519                <p>
5520                  <code class="computeroutput"><span class="keyword">true</span></code> if the value
5521                  of <code class="computeroutput"><span class="identifier">c1</span></code> is less than
5522                  <code class="computeroutput"><span class="identifier">c2</span></code>.
5523                </p>
5524              </td>
5525</tr>
5526<tr>
5527<td>
5528                <p>
5529                  <code class="computeroutput"><span class="identifier">c1</span> <span class="special">&gt;</span>
5530                  <span class="identifier">c2</span></code>
5531                </p>
5532              </td>
5533<td>
5534                <p>
5535                  <code class="computeroutput"><span class="keyword">bool</span></code>
5536                </p>
5537              </td>
5538<td>
5539                <p>
5540                  <code class="computeroutput"><span class="keyword">true</span></code> if the value
5541                  of <code class="computeroutput"><span class="identifier">c1</span></code> is greater
5542                  than <code class="computeroutput"><span class="identifier">c2</span></code>.
5543                </p>
5544              </td>
5545</tr>
5546<tr>
5547<td>
5548                <p>
5549                  <code class="computeroutput"><span class="identifier">c1</span> <span class="special">&lt;=</span>
5550                  <span class="identifier">c2</span></code>
5551                </p>
5552              </td>
5553<td>
5554                <p>
5555                  <code class="computeroutput"><span class="keyword">bool</span></code>
5556                </p>
5557              </td>
5558<td>
5559                <p>
5560                  <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">c1</span></code> is less than or equal to
5561                  <code class="computeroutput"><span class="identifier">c2</span></code>.
5562                </p>
5563              </td>
5564</tr>
5565<tr>
5566<td>
5567                <p>
5568                  <code class="computeroutput"><span class="identifier">c1</span> <span class="special">&gt;=</span>
5569                  <span class="identifier">c2</span></code>
5570                </p>
5571              </td>
5572<td>
5573                <p>
5574                  <code class="computeroutput"><span class="keyword">bool</span></code>
5575                </p>
5576              </td>
5577<td>
5578                <p>
5579                  <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">c1</span></code> is greater than or equal to
5580                  <code class="computeroutput"><span class="identifier">c2</span></code>.
5581                </p>
5582              </td>
5583</tr>
5584<tr>
5585<td>
5586                <p>
5587                  <code class="computeroutput"><span class="identifier">intmax_t</span> <span class="identifier">i</span>
5588                  <span class="special">=</span> <span class="identifier">c1</span></code>
5589                </p>
5590              </td>
5591<td>
5592                <p>
5593                  <code class="computeroutput"><span class="keyword">int</span></code>
5594                </p>
5595              </td>
5596<td>
5597                <p>
5598                  <code class="computeroutput"><span class="identifier">CharT</span></code> must be convertible
5599                  to an integral type.
5600                </p>
5601              </td>
5602</tr>
5603<tr>
5604<td>
5605                <p>
5606                  <code class="computeroutput"><span class="identifier">CharT</span> <span class="identifier">c</span><span class="special">(</span><span class="identifier">i</span><span class="special">);</span></code>
5607                </p>
5608              </td>
5609<td>
5610                <p>
5611                  <code class="computeroutput"><span class="identifier">CharT</span></code>
5612                </p>
5613              </td>
5614<td>
5615                <p>
5616                  <code class="computeroutput"><span class="identifier">CharT</span></code> must be constructable
5617                  from an integral type.
5618                </p>
5619              </td>
5620</tr>
5621</tbody>
5622</table></div>
5623</div>
5624<br class="table-break"><h3>
5625<a name="boost_xpressive.user_s_guide.concepts.h1"></a>
5626        <span class="phrase"><a name="boost_xpressive.user_s_guide.concepts.traits_requirements"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.concepts.traits_requirements">Traits
5627        Requirements</a>
5628      </h3>
5629<p>
5630        In the following table <code class="computeroutput"><span class="identifier">X</span></code>
5631        denotes a traits class defining types and functions for the character container
5632        type <code class="computeroutput"><span class="identifier">CharT</span></code>; <code class="computeroutput"><span class="identifier">u</span></code> is an object of type <code class="computeroutput"><span class="identifier">X</span></code>;
5633        <code class="computeroutput"><span class="identifier">v</span></code> is an object of type <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">X</span></code>;
5634        <code class="computeroutput"><span class="identifier">p</span></code> is a value of type <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">CharT</span><span class="special">*</span></code>; <code class="computeroutput"><span class="identifier">I1</span></code>
5635        and <code class="computeroutput"><span class="identifier">I2</span></code> are <code class="computeroutput"><span class="identifier">Input</span> <span class="identifier">Iterators</span></code>;
5636        <code class="computeroutput"><span class="identifier">c</span></code> is a value of type <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">CharT</span></code>;
5637        <code class="computeroutput"><span class="identifier">s</span></code> is an object of type <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">string_type</span></code>;
5638        <code class="computeroutput"><span class="identifier">cs</span></code> is an object of type
5639        <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">string_type</span></code>;
5640        <code class="computeroutput"><span class="identifier">b</span></code> is a value of type <code class="computeroutput"><span class="keyword">bool</span></code>; <code class="computeroutput"><span class="identifier">i</span></code>
5641        is a value of type <code class="computeroutput"><span class="keyword">int</span></code>; <code class="computeroutput"><span class="identifier">F1</span></code> and <code class="computeroutput"><span class="identifier">F2</span></code>
5642        are values of type <code class="computeroutput"><span class="keyword">const</span> <span class="identifier">CharT</span><span class="special">*</span></code>; <code class="computeroutput"><span class="identifier">loc</span></code>
5643        is an object of type <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">locale_type</span></code>; and <code class="computeroutput"><span class="identifier">ch</span></code>
5644        is an object of <code class="computeroutput"><span class="keyword">const</span> <span class="keyword">char</span></code>.
5645      </p>
5646<div class="table">
5647<a name="boost_xpressive.user_s_guide.concepts.t1"></a><p class="title"><b>Table 46.15. Traits Requirements</b></p>
5648<div class="table-contents"><table class="table" summary="Traits Requirements">
5649<colgroup>
5650<col>
5651<col>
5652<col>
5653</colgroup>
5654<thead><tr>
5655<th>
5656                <p>
5657                  <span class="bold"><strong>Expression</strong></span>
5658                </p>
5659              </th>
5660<th>
5661                <p>
5662                  <span class="bold"><strong>Return type</strong></span>
5663                </p>
5664              </th>
5665<th>
5666                <p>
5667                  <span class="bold"><strong>Assertion / Note<br> Pre / Post condition</strong></span>
5668                </p>
5669              </th>
5670</tr></thead>
5671<tbody>
5672<tr>
5673<td>
5674                <p>
5675                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">char_type</span></code>
5676                </p>
5677              </td>
5678<td>
5679                <p>
5680                  <code class="computeroutput"><span class="identifier">CharT</span></code>
5681                </p>
5682              </td>
5683<td>
5684                <p>
5685                  The character container type used in the implementation of class
5686                  template <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/basic_regex.html" title="Struct template basic_regex">basic_regex&lt;&gt;</a></code></code>.
5687                </p>
5688              </td>
5689</tr>
5690<tr>
5691<td>
5692                <p>
5693                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">string_type</span></code>
5694                </p>
5695              </td>
5696<td>
5697                <p>
5698                  <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_string</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">&gt;</span></code>
5699                  or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">&gt;</span></code>
5700                </p>
5701              </td>
5702<td>
5703              </td>
5704</tr>
5705<tr>
5706<td>
5707                <p>
5708                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">locale_type</span></code>
5709                </p>
5710              </td>
5711<td>
5712                <p>
5713                  <span class="emphasis"><em>Implementation defined</em></span>
5714                </p>
5715              </td>
5716<td>
5717                <p>
5718                  A copy constructible type that represents the locale used by the
5719                  traits class.
5720                </p>
5721              </td>
5722</tr>
5723<tr>
5724<td>
5725                <p>
5726                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">char_class_type</span></code>
5727                </p>
5728              </td>
5729<td>
5730                <p>
5731                  <span class="emphasis"><em>Implementation defined</em></span>
5732                </p>
5733              </td>
5734<td>
5735                <p>
5736                  A bitmask type representing a particular character classification.
5737                  Multiple values of this type can be bitwise-or'ed together to obtain
5738                  a new valid value.
5739                </p>
5740              </td>
5741</tr>
5742<tr>
5743<td>
5744                <p>
5745                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">hash</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>
5746                </p>
5747              </td>
5748<td>
5749                <p>
5750                  <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">char</span></code>
5751                </p>
5752              </td>
5753<td>
5754                <p>
5755                  Yields a value between <code class="computeroutput"><span class="number">0</span></code>
5756                  and <code class="computeroutput"><span class="identifier">UCHAR_MAX</span></code> inclusive.
5757                </p>
5758              </td>
5759</tr>
5760<tr>
5761<td>
5762                <p>
5763                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">widen</span><span class="special">(</span><span class="identifier">ch</span><span class="special">)</span></code>
5764                </p>
5765              </td>
5766<td>
5767                <p>
5768                  <code class="computeroutput"><span class="identifier">CharT</span></code>
5769                </p>
5770              </td>
5771<td>
5772                <p>
5773                  Widens the specified <code class="computeroutput"><span class="keyword">char</span></code>
5774                  and returns the resulting <code class="computeroutput"><span class="identifier">CharT</span></code>.
5775                </p>
5776              </td>
5777</tr>
5778<tr>
5779<td>
5780                <p>
5781                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">in_range</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span>
5782                  <span class="identifier">r2</span><span class="special">,</span>
5783                  <span class="identifier">c</span><span class="special">)</span></code>
5784                </p>
5785              </td>
5786<td>
5787                <p>
5788                  <code class="computeroutput"><span class="keyword">bool</span></code>
5789                </p>
5790              </td>
5791<td>
5792                <p>
5793                  For any characters <code class="computeroutput"><span class="identifier">r1</span></code>
5794                  and <code class="computeroutput"><span class="identifier">r2</span></code>, returns
5795                  <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">r1</span> <span class="special">&lt;=</span>
5796                  <span class="identifier">c</span> <span class="special">&amp;&amp;</span>
5797                  <span class="identifier">c</span> <span class="special">&lt;=</span>
5798                  <span class="identifier">r2</span></code>. Requires that <code class="computeroutput"><span class="identifier">r1</span> <span class="special">&lt;=</span>
5799                  <span class="identifier">r2</span></code>.
5800                </p>
5801              </td>
5802</tr>
5803<tr>
5804<td>
5805                <p>
5806                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">in_range_nocase</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span>
5807                  <span class="identifier">r2</span><span class="special">,</span>
5808                  <span class="identifier">c</span><span class="special">)</span></code>
5809                </p>
5810              </td>
5811<td>
5812                <p>
5813                  <code class="computeroutput"><span class="keyword">bool</span></code>
5814                </p>
5815              </td>
5816<td>
5817                <p>
5818                  For characters <code class="computeroutput"><span class="identifier">r1</span></code>
5819                  and <code class="computeroutput"><span class="identifier">r2</span></code>, returns
5820                  <code class="computeroutput"><span class="keyword">true</span></code> if there is some
5821                  character <code class="computeroutput"><span class="identifier">d</span></code> for
5822                  which <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">translate_nocase</span><span class="special">(</span><span class="identifier">d</span><span class="special">)</span>
5823                  <span class="special">==</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">translate_nocase</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> and <code class="computeroutput"><span class="identifier">r1</span>
5824                  <span class="special">&lt;=</span> <span class="identifier">d</span>
5825                  <span class="special">&amp;&amp;</span> <span class="identifier">d</span>
5826                  <span class="special">&lt;=</span> <span class="identifier">r2</span></code>.
5827                  Requires that <code class="computeroutput"><span class="identifier">r1</span> <span class="special">&lt;=</span> <span class="identifier">r2</span></code>.
5828                </p>
5829              </td>
5830</tr>
5831<tr>
5832<td>
5833                <p>
5834                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">translate</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>
5835                </p>
5836              </td>
5837<td>
5838                <p>
5839                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">char_type</span></code>
5840                </p>
5841              </td>
5842<td>
5843                <p>
5844                  Returns a character such that for any character <code class="computeroutput"><span class="identifier">d</span></code>
5845                  that is to be considered equivalent to <code class="computeroutput"><span class="identifier">c</span></code>
5846                  then <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">translate</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span>
5847                  <span class="special">==</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">translate</span><span class="special">(</span><span class="identifier">d</span><span class="special">)</span></code>.
5848                </p>
5849              </td>
5850</tr>
5851<tr>
5852<td>
5853                <p>
5854                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">translate_nocase</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>
5855                </p>
5856              </td>
5857<td>
5858                <p>
5859                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">char_type</span></code>
5860                </p>
5861              </td>
5862<td>
5863                <p>
5864                  For all characters <code class="computeroutput"><span class="identifier">C</span></code>
5865                  that are to be considered equivalent to <code class="computeroutput"><span class="identifier">c</span></code>
5866                  when comparisons are to be performed without regard to case, then
5867                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">translate_nocase</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span>
5868                  <span class="special">==</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">translate_nocase</span><span class="special">(</span><span class="identifier">C</span><span class="special">)</span></code>.
5869                </p>
5870              </td>
5871</tr>
5872<tr>
5873<td>
5874                <p>
5875                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">F1</span><span class="special">,</span>
5876                  <span class="identifier">F2</span><span class="special">)</span></code>
5877                </p>
5878              </td>
5879<td>
5880                <p>
5881                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">string_type</span></code>
5882                </p>
5883              </td>
5884<td>
5885                <p>
5886                  Returns a sort key for the character sequence designated by the
5887                  iterator range <code class="computeroutput"><span class="special">[</span><span class="identifier">F1</span><span class="special">,</span> <span class="identifier">F2</span><span class="special">)</span></code> such that if the character sequence
5888                  <code class="computeroutput"><span class="special">[</span><span class="identifier">G1</span><span class="special">,</span> <span class="identifier">G2</span><span class="special">)</span></code> sorts before the character sequence
5889                  <code class="computeroutput"><span class="special">[</span><span class="identifier">H1</span><span class="special">,</span> <span class="identifier">H2</span><span class="special">)</span></code> then <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">G1</span><span class="special">,</span> <span class="identifier">G2</span><span class="special">)</span> <span class="special">&lt;</span>
5890                  <span class="identifier">v</span><span class="special">.</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">H1</span><span class="special">,</span>
5891                  <span class="identifier">H2</span><span class="special">)</span></code>.
5892                </p>
5893              </td>
5894</tr>
5895<tr>
5896<td>
5897                <p>
5898                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">transform_primary</span><span class="special">(</span><span class="identifier">F1</span><span class="special">,</span>
5899                  <span class="identifier">F2</span><span class="special">)</span></code>
5900                </p>
5901              </td>
5902<td>
5903                <p>
5904                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">string_type</span></code>
5905                </p>
5906              </td>
5907<td>
5908                <p>
5909                  Returns a sort key for the character sequence designated by the
5910                  iterator range <code class="computeroutput"><span class="special">[</span><span class="identifier">F1</span><span class="special">,</span> <span class="identifier">F2</span><span class="special">)</span></code> such that if the character sequence
5911                  <code class="computeroutput"><span class="special">[</span><span class="identifier">G1</span><span class="special">,</span> <span class="identifier">G2</span><span class="special">)</span></code> sorts before the character sequence
5912                  <code class="computeroutput"><span class="special">[</span><span class="identifier">H1</span><span class="special">,</span> <span class="identifier">H2</span><span class="special">)</span></code> when character case is not considered
5913                  then <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">transform_primary</span><span class="special">(</span><span class="identifier">G1</span><span class="special">,</span>
5914                  <span class="identifier">G2</span><span class="special">)</span>
5915                  <span class="special">&lt;</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">transform_primary</span><span class="special">(</span><span class="identifier">H1</span><span class="special">,</span> <span class="identifier">H2</span><span class="special">)</span></code>.
5916                </p>
5917              </td>
5918</tr>
5919<tr>
5920<td>
5921                <p>
5922                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">lookup_classname</span><span class="special">(</span><span class="identifier">F1</span><span class="special">,</span>
5923                  <span class="identifier">F2</span><span class="special">)</span></code>
5924                </p>
5925              </td>
5926<td>
5927                <p>
5928                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">char_class_type</span></code>
5929                </p>
5930              </td>
5931<td>
5932                <p>
5933                  Converts the character sequence designated by the iterator range
5934                  <code class="computeroutput"><span class="special">[</span><span class="identifier">F1</span><span class="special">,</span><span class="identifier">F2</span><span class="special">)</span></code> into a bitmask type that can subsequently
5935                  be passed to <code class="computeroutput"><span class="identifier">isctype</span></code>.
5936                  Values returned from <code class="computeroutput"><span class="identifier">lookup_classname</span></code>
5937                  can be safely bitwise or'ed together. Returns <code class="computeroutput"><span class="number">0</span></code>
5938                  if the character sequence is not the name of a character class
5939                  recognized by <code class="computeroutput"><span class="identifier">X</span></code>.
5940                  The value returned shall be independent of the case of the characters
5941                  in the sequence.
5942                </p>
5943              </td>
5944</tr>
5945<tr>
5946<td>
5947                <p>
5948                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">lookup_collatename</span><span class="special">(</span><span class="identifier">F1</span><span class="special">,</span>
5949                  <span class="identifier">F2</span><span class="special">)</span></code>
5950                </p>
5951              </td>
5952<td>
5953                <p>
5954                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">string_type</span></code>
5955                </p>
5956              </td>
5957<td>
5958                <p>
5959                  Returns a sequence of characters that represents the collating
5960                  element consisting of the character sequence designated by the
5961                  iterator range <code class="computeroutput"><span class="special">[</span><span class="identifier">F1</span><span class="special">,</span> <span class="identifier">F2</span><span class="special">)</span></code>. Returns an empty string if the
5962                  character sequence is not a valid collating element.
5963                </p>
5964              </td>
5965</tr>
5966<tr>
5967<td>
5968                <p>
5969                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">isctype</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span>
5970                  <span class="identifier">v</span><span class="special">.</span><span class="identifier">lookup_classname</span><span class="special">(</span><span class="identifier">F1</span><span class="special">,</span>
5971                  <span class="identifier">F2</span><span class="special">))</span></code>
5972                </p>
5973              </td>
5974<td>
5975                <p>
5976                  <code class="computeroutput"><span class="keyword">bool</span></code>
5977                </p>
5978              </td>
5979<td>
5980                <p>
5981                  Returns <code class="computeroutput"><span class="keyword">true</span></code> if character
5982                  <code class="computeroutput"><span class="identifier">c</span></code> is a member of
5983                  the character class designated by the iterator range <code class="computeroutput"><span class="special">[</span><span class="identifier">F1</span><span class="special">,</span> <span class="identifier">F2</span><span class="special">)</span></code>, <code class="computeroutput"><span class="keyword">false</span></code>
5984                  otherwise.
5985                </p>
5986              </td>
5987</tr>
5988<tr>
5989<td>
5990                <p>
5991                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">value</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span>
5992                  <span class="identifier">i</span><span class="special">)</span></code>
5993                </p>
5994              </td>
5995<td>
5996                <p>
5997                  <code class="computeroutput"><span class="keyword">int</span></code>
5998                </p>
5999              </td>
6000<td>
6001                <p>
6002                  Returns the value represented by the digit <code class="computeroutput"><span class="identifier">c</span></code>
6003                  in base <code class="computeroutput"><span class="identifier">i</span></code> if the
6004                  character <code class="computeroutput"><span class="identifier">c</span></code> is
6005                  a valid digit in base <code class="computeroutput"><span class="identifier">i</span></code>;
6006                  otherwise returns <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>.<br> [Note: the value of <code class="computeroutput"><span class="identifier">i</span></code> will only be <code class="computeroutput"><span class="number">8</span></code>, <code class="computeroutput"><span class="number">10</span></code>,
6007                  or <code class="computeroutput"><span class="number">16</span></code>. -end note]
6008                </p>
6009              </td>
6010</tr>
6011<tr>
6012<td>
6013                <p>
6014                  <code class="computeroutput"><span class="identifier">u</span><span class="special">.</span><span class="identifier">imbue</span><span class="special">(</span><span class="identifier">loc</span><span class="special">)</span></code>
6015                </p>
6016              </td>
6017<td>
6018                <p>
6019                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">locale_type</span></code>
6020                </p>
6021              </td>
6022<td>
6023                <p>
6024                  Imbues <code class="computeroutput"><span class="identifier">u</span></code> with the
6025                  locale <code class="computeroutput"><span class="identifier">loc</span></code>, returns
6026                  the previous locale used by <code class="computeroutput"><span class="identifier">u</span></code>.
6027                </p>
6028              </td>
6029</tr>
6030<tr>
6031<td>
6032                <p>
6033                  <code class="computeroutput"><span class="identifier">v</span><span class="special">.</span><span class="identifier">getloc</span><span class="special">()</span></code>
6034                </p>
6035              </td>
6036<td>
6037                <p>
6038                  <code class="computeroutput"><span class="identifier">X</span><span class="special">::</span><span class="identifier">locale_type</span></code>
6039                </p>
6040              </td>
6041<td>
6042                <p>
6043                  Returns the current locale used by <code class="computeroutput"><span class="identifier">v</span></code>.
6044                </p>
6045              </td>
6046</tr>
6047</tbody>
6048</table></div>
6049</div>
6050<br class="table-break"><h3>
6051<a name="boost_xpressive.user_s_guide.concepts.h2"></a>
6052        <span class="phrase"><a name="boost_xpressive.user_s_guide.concepts.acknowledgements"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.concepts.acknowledgements">Acknowledgements</a>
6053      </h3>
6054<p>
6055        This section is adapted from the equivalent page in the <a href="../../../libs/regex" target="_top">Boost.Regex</a>
6056        documentation and from the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1429.htm" target="_top">proposal</a>
6057        to add regular expressions to the Standard Library.
6058      </p>
6059</div>
6060<div class="section">
6061<div class="titlepage"><div><div><h3 class="title">
6062<a name="boost_xpressive.user_s_guide.examples"></a><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">Examples</a>
6063</h3></div></div></div>
6064<p>
6065        Below you can find six complete sample programs. <br>
6066      </p>
6067<p></p>
6068<h5>
6069<a name="boost_xpressive.user_s_guide.examples.h0"></a>
6070        <span class="phrase"><a name="boost_xpressive.user_s_guide.examples.see_if_a_whole_string_matches_a_regex"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.see_if_a_whole_string_matches_a_regex">See
6071        if a whole string matches a regex</a>
6072      </h5>
6073<p>
6074        This is the example from the Introduction. It is reproduced here for your
6075        convenience.
6076      </p>
6077<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
6078<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6079
6080<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
6081
6082<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
6083<span class="special">{</span>
6084    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">hello</span><span class="special">(</span> <span class="string">"hello world!"</span> <span class="special">);</span>
6085
6086    <span class="identifier">sregex</span> <span class="identifier">rex</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"(\\w+) (\\w+)!"</span> <span class="special">);</span>
6087    <span class="identifier">smatch</span> <span class="identifier">what</span><span class="special">;</span>
6088
6089    <span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_match</span><span class="special">(</span> <span class="identifier">hello</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">rex</span> <span class="special">)</span> <span class="special">)</span>
6090    <span class="special">{</span>
6091        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// whole match</span>
6092        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// first capture</span>
6093        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// second capture</span>
6094    <span class="special">}</span>
6095
6096    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
6097<span class="special">}</span>
6098</pre>
6099<p>
6100        This program outputs the following:
6101      </p>
6102<pre class="programlisting">hello world!
6103hello
6104world
6105</pre>
6106<p>
6107        <br> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">top</a>
6108      </p>
6109<p></p>
6110<h5>
6111<a name="boost_xpressive.user_s_guide.examples.h1"></a>
6112        <span class="phrase"><a name="boost_xpressive.user_s_guide.examples.see_if_a_string_contains_a_sub_string_that_matches_a_regex"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.see_if_a_string_contains_a_sub_string_that_matches_a_regex">See
6113        if a string contains a sub-string that matches a regex</a>
6114      </h5>
6115<p>
6116        Notice in this example how we use custom <code class="computeroutput"><span class="identifier">mark_tag</span></code>s
6117        to make the pattern more readable. We can use the <code class="computeroutput"><span class="identifier">mark_tag</span></code>s
6118        later to index into the <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/match_results.html" title="Struct template match_results">match_results&lt;&gt;</a></code></code>.
6119      </p>
6120<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
6121<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6122
6123<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
6124
6125<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
6126<span class="special">{</span>
6127    <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span><span class="identifier">str</span> <span class="special">=</span> <span class="string">"I was born on 5/30/1973 at 7am."</span><span class="special">;</span>
6128
6129    <span class="comment">// define some custom mark_tags with names more meaningful than s1, s2, etc.</span>
6130    <span class="identifier">mark_tag</span> <span class="identifier">day</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">month</span><span class="special">(</span><span class="number">2</span><span class="special">),</span> <span class="identifier">year</span><span class="special">(</span><span class="number">3</span><span class="special">),</span> <span class="identifier">delim</span><span class="special">(</span><span class="number">4</span><span class="special">);</span>
6131
6132    <span class="comment">// this regex finds a date</span>
6133    <span class="identifier">cregex</span> <span class="identifier">date</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">month</span><span class="special">=</span> <span class="identifier">repeat</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">2</span><span class="special">&gt;(</span><span class="identifier">_d</span><span class="special">))</span>           <span class="comment">// find the month ...</span>
6134               <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">delim</span><span class="special">=</span> <span class="special">(</span><span class="identifier">set</span><span class="special">=</span> <span class="char">'/'</span><span class="special">,</span><span class="char">'-'</span><span class="special">))</span>            <span class="comment">// followed by a delimiter ...</span>
6135               <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">day</span><span class="special">=</span>   <span class="identifier">repeat</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">2</span><span class="special">&gt;(</span><span class="identifier">_d</span><span class="special">))</span> <span class="special">&gt;&gt;</span> <span class="identifier">delim</span>  <span class="comment">// and a day followed by the same delimiter ...</span>
6136               <span class="special">&gt;&gt;</span> <span class="special">(</span><span class="identifier">year</span><span class="special">=</span>  <span class="identifier">repeat</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span><span class="number">2</span><span class="special">&gt;(</span><span class="identifier">_d</span> <span class="special">&gt;&gt;</span> <span class="identifier">_d</span><span class="special">));</span>    <span class="comment">// and the year.</span>
6137
6138    <span class="identifier">cmatch</span> <span class="identifier">what</span><span class="special">;</span>
6139
6140    <span class="keyword">if</span><span class="special">(</span> <span class="identifier">regex_search</span><span class="special">(</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">what</span><span class="special">,</span> <span class="identifier">date</span> <span class="special">)</span> <span class="special">)</span>
6141    <span class="special">{</span>
6142        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span>     <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// whole match</span>
6143        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="identifier">day</span><span class="special">]</span>   <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// the day</span>
6144        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="identifier">month</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// the month</span>
6145        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="identifier">year</span><span class="special">]</span>  <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// the year</span>
6146        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="identifier">delim</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span> <span class="comment">// the delimiter</span>
6147    <span class="special">}</span>
6148
6149    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
6150<span class="special">}</span>
6151</pre>
6152<p>
6153        This program outputs the following:
6154      </p>
6155<pre class="programlisting">5/30/1973
615630
61575
61581973
6159/
6160</pre>
6161<p>
6162        <br> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">top</a>
6163      </p>
6164<p></p>
6165<h5>
6166<a name="boost_xpressive.user_s_guide.examples.h2"></a>
6167        <span class="phrase"><a name="boost_xpressive.user_s_guide.examples.replace_all_sub_strings_that_match_a_regex"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.replace_all_sub_strings_that_match_a_regex">Replace
6168        all sub-strings that match a regex</a>
6169      </h5>
6170<p>
6171        The following program finds dates in a string and marks them up with pseudo-HTML.
6172      </p>
6173<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
6174<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6175
6176<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
6177
6178<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
6179<span class="special">{</span>
6180    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span> <span class="string">"I was born on 5/30/1973 at 7am."</span> <span class="special">);</span>
6181
6182    <span class="comment">// essentially the same regex as in the previous example, but using a dynamic regex</span>
6183    <span class="identifier">sregex</span> <span class="identifier">date</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"(\\d{1,2})([/-])(\\d{1,2})\\2((?:\\d{2}){1,2})"</span> <span class="special">);</span>
6184
6185    <span class="comment">// As in Perl, $&amp; is a reference to the sub-string that matched the regex</span>
6186    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">format</span><span class="special">(</span> <span class="string">"&lt;date&gt;$&amp;&lt;/date&gt;"</span> <span class="special">);</span>
6187
6188    <span class="identifier">str</span> <span class="special">=</span> <span class="identifier">regex_replace</span><span class="special">(</span> <span class="identifier">str</span><span class="special">,</span> <span class="identifier">date</span><span class="special">,</span> <span class="identifier">format</span> <span class="special">);</span>
6189    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">str</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
6190
6191    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
6192<span class="special">}</span>
6193</pre>
6194<p>
6195        This program outputs the following:
6196      </p>
6197<pre class="programlisting">I was born on &lt;date&gt;5/30/1973&lt;/date&gt; at 7am.
6198</pre>
6199<p>
6200        <br> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">top</a>
6201      </p>
6202<p></p>
6203<h5>
6204<a name="boost_xpressive.user_s_guide.examples.h3"></a>
6205        <span class="phrase"><a name="boost_xpressive.user_s_guide.examples.find_all_the_sub_strings_that_match_a_regex_and_step_through_them_one_at_a_time"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.find_all_the_sub_strings_that_match_a_regex_and_step_through_them_one_at_a_time">Find
6206        all the sub-strings that match a regex and step through them one at a time</a>
6207      </h5>
6208<p>
6209        The following program finds the words in a wide-character string. It uses
6210        <code class="computeroutput"><span class="identifier">wsregex_iterator</span></code>. Notice
6211        that dereferencing a <code class="computeroutput"><span class="identifier">wsregex_iterator</span></code>
6212        yields a <code class="computeroutput"><span class="identifier">wsmatch</span></code> object.
6213      </p>
6214<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
6215<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6216
6217<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
6218
6219<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
6220<span class="special">{</span>
6221    <span class="identifier">std</span><span class="special">::</span><span class="identifier">wstring</span> <span class="identifier">str</span><span class="special">(</span> <span class="identifier">L</span><span class="string">"This is his face."</span> <span class="special">);</span>
6222
6223    <span class="comment">// find a whole word</span>
6224    <span class="identifier">wsregex</span> <span class="identifier">token</span> <span class="special">=</span> <span class="special">+</span><span class="identifier">alnum</span><span class="special">;</span>
6225
6226    <span class="identifier">wsregex_iterator</span> <span class="identifier">cur</span><span class="special">(</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">token</span> <span class="special">);</span>
6227    <span class="identifier">wsregex_iterator</span> <span class="identifier">end</span><span class="special">;</span>
6228
6229    <span class="keyword">for</span><span class="special">(</span> <span class="special">;</span> <span class="identifier">cur</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">;</span> <span class="special">++</span><span class="identifier">cur</span> <span class="special">)</span>
6230    <span class="special">{</span>
6231        <span class="identifier">wsmatch</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">what</span> <span class="special">=</span> <span class="special">*</span><span class="identifier">cur</span><span class="special">;</span>
6232        <span class="identifier">std</span><span class="special">::</span><span class="identifier">wcout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="identifier">L</span><span class="char">'\n'</span><span class="special">;</span>
6233    <span class="special">}</span>
6234
6235    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
6236<span class="special">}</span>
6237</pre>
6238<p>
6239        This program outputs the following:
6240      </p>
6241<pre class="programlisting">This
6242is
6243his
6244face
6245</pre>
6246<p>
6247        <br> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">top</a>
6248      </p>
6249<p></p>
6250<h5>
6251<a name="boost_xpressive.user_s_guide.examples.h4"></a>
6252        <span class="phrase"><a name="boost_xpressive.user_s_guide.examples.split_a_string_into_tokens_that_each_match_a_regex"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.split_a_string_into_tokens_that_each_match_a_regex">Split
6253        a string into tokens that each match a regex</a>
6254      </h5>
6255<p>
6256        The following program finds race times in a string and displays first the
6257        minutes and then the seconds. It uses <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>.
6258      </p>
6259<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
6260<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6261
6262<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
6263
6264<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
6265<span class="special">{</span>
6266    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span> <span class="string">"Eric: 4:40, Karl: 3:35, Francesca: 2:32"</span> <span class="special">);</span>
6267
6268    <span class="comment">// find a race time</span>
6269    <span class="identifier">sregex</span> <span class="identifier">time</span> <span class="special">=</span> <span class="identifier">sregex</span><span class="special">::</span><span class="identifier">compile</span><span class="special">(</span> <span class="string">"(\\d):(\\d\\d)"</span> <span class="special">);</span>
6270
6271    <span class="comment">// for each match, the token iterator should first take the value of</span>
6272    <span class="comment">// the first marked sub-expression followed by the value of the second</span>
6273    <span class="comment">// marked sub-expression</span>
6274    <span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">subs</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span> <span class="special">};</span>
6275
6276    <span class="identifier">sregex_token_iterator</span> <span class="identifier">cur</span><span class="special">(</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">time</span><span class="special">,</span> <span class="identifier">subs</span> <span class="special">);</span>
6277    <span class="identifier">sregex_token_iterator</span> <span class="identifier">end</span><span class="special">;</span>
6278
6279    <span class="keyword">for</span><span class="special">(</span> <span class="special">;</span> <span class="identifier">cur</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">;</span> <span class="special">++</span><span class="identifier">cur</span> <span class="special">)</span>
6280    <span class="special">{</span>
6281        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="special">*</span><span class="identifier">cur</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
6282    <span class="special">}</span>
6283
6284    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
6285<span class="special">}</span>
6286</pre>
6287<p>
6288        This program outputs the following:
6289      </p>
6290<pre class="programlisting">4
629140
62923
629335
62942
629532
6296</pre>
6297<p>
6298        <br> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">top</a>
6299      </p>
6300<p></p>
6301<h5>
6302<a name="boost_xpressive.user_s_guide.examples.h5"></a>
6303        <span class="phrase"><a name="boost_xpressive.user_s_guide.examples.split_a_string_using_a_regex_as_a_delimiter"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.split_a_string_using_a_regex_as_a_delimiter">Split
6304        a string using a regex as a delimiter</a>
6305      </h5>
6306<p>
6307        The following program takes some text that has been marked up with html and
6308        strips out the mark-up. It uses a regex that matches an HTML tag and a <code class="literal"><code class="computeroutput"><a class="link" href="../boost/xpressive/regex_token_iterator.html" title="Struct template regex_token_iterator">regex_token_iterator&lt;&gt;</a></code></code>
6309        that returns the parts of the string that do <span class="emphasis"><em>not</em></span> match
6310        the regex.
6311      </p>
6312<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
6313<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">/</span><span class="identifier">xpressive</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6314
6315<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">xpressive</span><span class="special">;</span>
6316
6317<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
6318<span class="special">{</span>
6319    <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span><span class="special">(</span> <span class="string">"Now &lt;bold&gt;is the time &lt;i&gt;for all good men&lt;/i&gt; to come to the aid of their&lt;/bold&gt; country."</span> <span class="special">);</span>
6320
6321    <span class="comment">// find a HTML tag</span>
6322    <span class="identifier">sregex</span> <span class="identifier">html</span> <span class="special">=</span> <span class="char">'&lt;'</span> <span class="special">&gt;&gt;</span> <span class="identifier">optional</span><span class="special">(</span><span class="char">'/'</span><span class="special">)</span> <span class="special">&gt;&gt;</span> <span class="special">+</span><span class="identifier">_w</span> <span class="special">&gt;&gt;</span> <span class="char">'&gt;'</span><span class="special">;</span>
6323
6324    <span class="comment">// the -1 below directs the token iterator to display the parts of</span>
6325    <span class="comment">// the string that did NOT match the regular expression.</span>
6326    <span class="identifier">sregex_token_iterator</span> <span class="identifier">cur</span><span class="special">(</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">str</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">html</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span> <span class="special">);</span>
6327    <span class="identifier">sregex_token_iterator</span> <span class="identifier">end</span><span class="special">;</span>
6328
6329    <span class="keyword">for</span><span class="special">(</span> <span class="special">;</span> <span class="identifier">cur</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">;</span> <span class="special">++</span><span class="identifier">cur</span> <span class="special">)</span>
6330    <span class="special">{</span>
6331        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="char">'{'</span> <span class="special">&lt;&lt;</span> <span class="special">*</span><span class="identifier">cur</span> <span class="special">&lt;&lt;</span> <span class="char">'}'</span><span class="special">;</span>
6332    <span class="special">}</span>
6333    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
6334
6335    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
6336<span class="special">}</span>
6337</pre>
6338<p>
6339        This program outputs the following:
6340      </p>
6341<pre class="programlisting">{Now }{is the time }{for all good men}{ to come to the aid of their}{ country.}
6342</pre>
6343<p>
6344        <br> <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">top</a>
6345      </p>
6346<p></p>
6347<h5>
6348<a name="boost_xpressive.user_s_guide.examples.h6"></a>
6349        <span class="phrase"><a name="boost_xpressive.user_s_guide.examples.display_a_tree_of_nested_results"></a></span><a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples.display_a_tree_of_nested_results">Display
6350        a tree of nested results</a>
6351      </h5>
6352<p>
6353        Here is a helper class to demonstrate how you might display a tree of nested
6354        results:
6355      </p>
6356<pre class="programlisting"><span class="comment">// Displays nested results to std::cout with indenting</span>
6357<span class="keyword">struct</span> <span class="identifier">output_nested_results</span>
6358<span class="special">{</span>
6359    <span class="keyword">int</span> <span class="identifier">tabs_</span><span class="special">;</span>
6360
6361    <span class="identifier">output_nested_results</span><span class="special">(</span> <span class="keyword">int</span> <span class="identifier">tabs</span> <span class="special">=</span> <span class="number">0</span> <span class="special">)</span>
6362        <span class="special">:</span> <span class="identifier">tabs_</span><span class="special">(</span> <span class="identifier">tabs</span> <span class="special">)</span>
6363    <span class="special">{</span>
6364    <span class="special">}</span>
6365
6366    <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">BidiIterT</span> <span class="special">&gt;</span>
6367    <span class="keyword">void</span> <span class="keyword">operator</span> <span class="special">()(</span> <span class="identifier">match_results</span><span class="special">&lt;</span> <span class="identifier">BidiIterT</span> <span class="special">&gt;</span> <span class="keyword">const</span> <span class="special">&amp;</span><span class="identifier">what</span> <span class="special">)</span> <span class="keyword">const</span>
6368    <span class="special">{</span>
6369        <span class="comment">// first, do some indenting</span>
6370        <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span> <span class="identifier">BidiIterT</span> <span class="special">&gt;::</span><span class="identifier">value_type</span> <span class="identifier">char_type</span><span class="special">;</span>
6371        <span class="identifier">char_type</span> <span class="identifier">space_ch</span> <span class="special">=</span> <span class="identifier">char_type</span><span class="special">(</span><span class="char">' '</span><span class="special">);</span>
6372        <span class="identifier">std</span><span class="special">::</span><span class="identifier">fill_n</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream_iterator</span><span class="special">&lt;</span><span class="identifier">char_type</span><span class="special">&gt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">),</span> <span class="identifier">tabs_</span> <span class="special">*</span> <span class="number">4</span><span class="special">,</span> <span class="identifier">space_ch</span> <span class="special">);</span>
6373
6374        <span class="comment">// output the match</span>
6375        <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">what</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
6376
6377        <span class="comment">// output any nested matches</span>
6378        <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span>
6379            <span class="identifier">what</span><span class="special">.</span><span class="identifier">nested_results</span><span class="special">().</span><span class="identifier">begin</span><span class="special">(),</span>
6380            <span class="identifier">what</span><span class="special">.</span><span class="identifier">nested_results</span><span class="special">().</span><span class="identifier">end</span><span class="special">(),</span>
6381            <span class="identifier">output_nested_results</span><span class="special">(</span> <span class="identifier">tabs_</span> <span class="special">+</span> <span class="number">1</span> <span class="special">)</span> <span class="special">);</span>
6382    <span class="special">}</span>
6383<span class="special">};</span>
6384</pre>
6385<p>
6386        <a class="link" href="user_s_guide.html#boost_xpressive.user_s_guide.examples" title="Examples">top</a>
6387      </p>
6388</div>
6389<div class="footnotes">
6390<br><hr style="width:100; text-align:left;margin-left: 0">
6391<div id="ftn.boost_xpressive.user_s_guide.introduction.f0" class="footnote"><p><a href="#boost_xpressive.user_s_guide.introduction.f0" class="para"><sup class="para">[36] </sup></a>
6392          See <a href="http://www.osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html" target="_top">Expression
6393          Templates</a>
6394        </p></div>
6395<div id="ftn.boost_xpressive.user_s_guide.symbol_tables_and_attributes.f0" class="footnote"><p><a href="#boost_xpressive.user_s_guide.symbol_tables_and_attributes.f0" class="para"><sup class="para">[37] </sup></a>
6396          Many thanks to David Jenkins, who contributed this example.
6397        </p></div>
6398</div>
6399</div>
6400<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
6401<td align="left"></td>
6402<td align="right"><div class="copyright-footer">Copyright © 2007 Eric Niebler<p>
6403        Distributed under the Boost Software License, Version 1.0. (See accompanying
6404        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
6405      </p>
6406</div></td>
6407</tr></table>
6408<hr>
6409<div class="spirit-nav">
6410<a accesskey="p" href="../xpressive.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../xpressive.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
6411</div>
6412</body>
6413</html>
6414