]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/xpressive/doc/examples.qbk
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / xpressive / doc / examples.qbk
CommitLineData
7c673cae
FG
1[/
2 / Copyright (c) 2008 Eric Niebler
3 /
4 / Distributed under the Boost Software License, Version 1.0. (See accompanying
5 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 /]
7
8[section Examples]
9
10Below you can find six complete sample programs.
11\n
12
13----
14
15[h4 See if a whole string matches a regex]
16
17This is the example from the Introduction. It is reproduced here for your convenience.
18
19 #include <iostream>
20 #include <boost/xpressive/xpressive.hpp>
21
22 using namespace boost::xpressive;
23
24 int main()
25 {
26 std::string hello( "hello world!" );
27
28 sregex rex = sregex::compile( "(\\w+) (\\w+)!" );
29 smatch what;
30
31 if( regex_match( hello, what, rex ) )
32 {
33 std::cout << what[0] << '\n'; // whole match
34 std::cout << what[1] << '\n'; // first capture
35 std::cout << what[2] << '\n'; // second capture
36 }
37
38 return 0;
39 }
40
41This program outputs the following:
42
43[pre
44hello world!
45hello
46world
47]
48\n
49[link boost_xpressive.user_s_guide.examples top]
50
51----
52
53[h4 See if a string contains a sub-string that matches a regex]
54
55Notice in this example how we use custom `mark_tag`s to make the pattern more readable.
56We can use the `mark_tag`s later to index into the _match_results_.
57
58 #include <iostream>
59 #include <boost/xpressive/xpressive.hpp>
60
61 using namespace boost::xpressive;
62
63 int main()
64 {
65 char const *str = "I was born on 5/30/1973 at 7am.";
66
67 // define some custom mark_tags with names more meaningful than s1, s2, etc.
68 mark_tag day(1), month(2), year(3), delim(4);
69
70 // this regex finds a date
71 cregex date = (month= repeat<1,2>(_d)) // find the month ...
72 >> (delim= (set= '/','-')) // followed by a delimiter ...
73 >> (day= repeat<1,2>(_d)) >> delim // and a day followed by the same delimiter ...
74 >> (year= repeat<1,2>(_d >> _d)); // and the year.
75
76 cmatch what;
77
78 if( regex_search( str, what, date ) )
79 {
80 std::cout << what[0] << '\n'; // whole match
81 std::cout << what[day] << '\n'; // the day
82 std::cout << what[month] << '\n'; // the month
83 std::cout << what[year] << '\n'; // the year
84 std::cout << what[delim] << '\n'; // the delimiter
85 }
86
87 return 0;
88 }
89
90This program outputs the following:
91
92[pre
935/30/1973
9430
955
961973
97/
98]
99\n
100[link boost_xpressive.user_s_guide.examples top]
101
102----
103
104[h4 Replace all sub-strings that match a regex]
105
106The following program finds dates in a string and marks them up with pseudo-HTML.
107
108 #include <iostream>
109 #include <boost/xpressive/xpressive.hpp>
110
111 using namespace boost::xpressive;
112
113 int main()
114 {
115 std::string str( "I was born on 5/30/1973 at 7am." );
116
117 // essentially the same regex as in the previous example, but using a dynamic regex
118 sregex date = sregex::compile( "(\\d{1,2})([/-])(\\d{1,2})\\2((?:\\d{2}){1,2})" );
119
120 // As in Perl, $& is a reference to the sub-string that matched the regex
121 std::string format( "<date>$&</date>" );
122
123 str = regex_replace( str, date, format );
124 std::cout << str << '\n';
125
126 return 0;
127 }
128
129This program outputs the following:
130
131[pre
132I was born on <date>5/30/1973</date> at 7am.
133]
134\n
135[link boost_xpressive.user_s_guide.examples top]
136
137----
138
139[h4 Find all the sub-strings that match a regex and step through them one at a time]
140
141The following program finds the words in a wide-character string.
142It uses `wsregex_iterator`. Notice that dereferencing a `wsregex_iterator`
143yields a `wsmatch` object.
144
145 #include <iostream>
146 #include <boost/xpressive/xpressive.hpp>
147
148 using namespace boost::xpressive;
149
150 int main()
151 {
152 std::wstring str( L"This is his face." );
153
154 // find a whole word
155 wsregex token = +alnum;
156
157 wsregex_iterator cur( str.begin(), str.end(), token );
158 wsregex_iterator end;
159
160 for( ; cur != end; ++cur )
161 {
162 wsmatch const &what = *cur;
163 std::wcout << what[0] << L'\n';
164 }
165
166 return 0;
167 }
168
169This program outputs the following:
170
171[pre
172This
173is
174his
175face
176]
177\n
178[link boost_xpressive.user_s_guide.examples top]
179
180----
181
182[h4 Split a string into tokens that each match a regex]
183
184The following program finds race times in a string and displays first
185the minutes and then the seconds. It uses _regex_token_iterator_.
186
187 #include <iostream>
188 #include <boost/xpressive/xpressive.hpp>
189
190 using namespace boost::xpressive;
191
192 int main()
193 {
194 std::string str( "Eric: 4:40, Karl: 3:35, Francesca: 2:32" );
195
196 // find a race time
197 sregex time = sregex::compile( "(\\d):(\\d\\d)" );
198
199 // for each match, the token iterator should first take the value of
200 // the first marked sub-expression followed by the value of the second
201 // marked sub-expression
202 int const subs[] = { 1, 2 };
203
204 sregex_token_iterator cur( str.begin(), str.end(), time, subs );
205 sregex_token_iterator end;
206
207 for( ; cur != end; ++cur )
208 {
209 std::cout << *cur << '\n';
210 }
211
212 return 0;
213 }
214
215This program outputs the following:
216
217[pre
2184
21940
2203
22135
2222
22332
224]
225\n
226[link boost_xpressive.user_s_guide.examples top]
227
228----
229
230[h4 Split a string using a regex as a delimiter]
231
232The following program takes some text that has been marked up with html and strips
233out the mark-up. It uses a regex that matches an HTML tag and a _regex_token_iterator_
234that returns the parts of the string that do ['not] match the regex.
235
236 #include <iostream>
237 #include <boost/xpressive/xpressive.hpp>
238
239 using namespace boost::xpressive;
240
241 int main()
242 {
243 std::string str( "Now <bold>is the time <i>for all good men</i> to come to the aid of their</bold> country." );
244
245 // find a HTML tag
246 sregex html = '<' >> optional('/') >> +_w >> '>';
247
248 // the -1 below directs the token iterator to display the parts of
249 // the string that did NOT match the regular expression.
250 sregex_token_iterator cur( str.begin(), str.end(), html, -1 );
251 sregex_token_iterator end;
252
253 for( ; cur != end; ++cur )
254 {
255 std::cout << '{' << *cur << '}';
256 }
257 std::cout << '\n';
258
259 return 0;
260 }
261
262This program outputs the following:
263
264[pre
265{Now }{is the time }{for all good men}{ to come to the aid of their}{ country.}
266]
267\n
268[link boost_xpressive.user_s_guide.examples top]
269
270----
271
272[h4 Display a tree of nested results]
273
274Here is a helper class to demonstrate how you might display a tree of nested results:
275
276 // Displays nested results to std::cout with indenting
277 struct output_nested_results
278 {
279 int tabs_;
280
281 output_nested_results( int tabs = 0 )
282 : tabs_( tabs )
283 {
284 }
285
286 template< typename BidiIterT >
287 void operator ()( match_results< BidiIterT > const &what ) const
288 {
289 // first, do some indenting
290 typedef typename std::iterator_traits< BidiIterT >::value_type char_type;
291 char_type space_ch = char_type(' ');
292 std::fill_n( std::ostream_iterator<char_type>( std::cout ), tabs_ * 4, space_ch );
293
294 // output the match
295 std::cout << what[0] << '\n';
296
297 // output any nested matches
298 std::for_each(
299 what.nested_results().begin(),
300 what.nested_results().end(),
301 output_nested_results( tabs_ + 1 ) );
302 }
303 };
304
305[link boost_xpressive.user_s_guide.examples top]
306
307[endsect]