123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- [/
- / Copyright (c) 2008 Eric Niebler
- /
- / Distributed under the Boost Software License, Version 1.0. (See accompanying
- / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- /]
- [section Examples]
- Below you can find six complete sample programs.
- \n
- ----
- [h4 See if a whole string matches a regex]
- This is the example from the Introduction. It is reproduced here for your convenience.
- #include <iostream>
- #include <boost/xpressive/xpressive.hpp>
- using namespace boost::xpressive;
- int main()
- {
- std::string hello( "hello world!" );
- sregex rex = sregex::compile( "(\\w+) (\\w+)!" );
- smatch what;
- if( regex_match( hello, what, rex ) )
- {
- std::cout << what[0] << '\n'; // whole match
- std::cout << what[1] << '\n'; // first capture
- std::cout << what[2] << '\n'; // second capture
- }
- return 0;
- }
- This program outputs the following:
- [pre
- hello world!
- hello
- world
- ]
- \n
- [link boost_xpressive.user_s_guide.examples top]
- ----
- [h4 See if a string contains a sub-string that matches a regex]
- Notice in this example how we use custom `mark_tag`s to make the pattern more readable.
- We can use the `mark_tag`s later to index into the _match_results_.
- #include <iostream>
- #include <boost/xpressive/xpressive.hpp>
- using namespace boost::xpressive;
- int main()
- {
- char const *str = "I was born on 5/30/1973 at 7am.";
- // define some custom mark_tags with names more meaningful than s1, s2, etc.
- mark_tag day(1), month(2), year(3), delim(4);
- // this regex finds a date
- cregex date = (month= repeat<1,2>(_d)) // find the month ...
- >> (delim= (set= '/','-')) // followed by a delimiter ...
- >> (day= repeat<1,2>(_d)) >> delim // and a day followed by the same delimiter ...
- >> (year= repeat<1,2>(_d >> _d)); // and the year.
- cmatch what;
- if( regex_search( str, what, date ) )
- {
- std::cout << what[0] << '\n'; // whole match
- std::cout << what[day] << '\n'; // the day
- std::cout << what[month] << '\n'; // the month
- std::cout << what[year] << '\n'; // the year
- std::cout << what[delim] << '\n'; // the delimiter
- }
- return 0;
- }
- This program outputs the following:
- [pre
- 5/30/1973
- 30
- 5
- 1973
- /
- ]
- \n
- [link boost_xpressive.user_s_guide.examples top]
- ----
- [h4 Replace all sub-strings that match a regex]
- The following program finds dates in a string and marks them up with pseudo-HTML.
- #include <iostream>
- #include <boost/xpressive/xpressive.hpp>
- using namespace boost::xpressive;
- int main()
- {
- std::string str( "I was born on 5/30/1973 at 7am." );
- // essentially the same regex as in the previous example, but using a dynamic regex
- sregex date = sregex::compile( "(\\d{1,2})([/-])(\\d{1,2})\\2((?:\\d{2}){1,2})" );
- // As in Perl, $& is a reference to the sub-string that matched the regex
- std::string format( "<date>$&</date>" );
- str = regex_replace( str, date, format );
- std::cout << str << '\n';
- return 0;
- }
- This program outputs the following:
- [pre
- I was born on <date>5/30/1973</date> at 7am.
- ]
- \n
- [link boost_xpressive.user_s_guide.examples top]
- ----
- [h4 Find all the sub-strings that match a regex and step through them one at a time]
- The following program finds the words in a wide-character string.
- It uses `wsregex_iterator`. Notice that dereferencing a `wsregex_iterator`
- yields a `wsmatch` object.
- #include <iostream>
- #include <boost/xpressive/xpressive.hpp>
- using namespace boost::xpressive;
- int main()
- {
- std::wstring str( L"This is his face." );
- // find a whole word
- wsregex token = +alnum;
- wsregex_iterator cur( str.begin(), str.end(), token );
- wsregex_iterator end;
- for( ; cur != end; ++cur )
- {
- wsmatch const &what = *cur;
- std::wcout << what[0] << L'\n';
- }
- return 0;
- }
- This program outputs the following:
- [pre
- This
- is
- his
- face
- ]
- \n
- [link boost_xpressive.user_s_guide.examples top]
- ----
- [h4 Split a string into tokens that each match a regex]
- The following program finds race times in a string and displays first
- the minutes and then the seconds. It uses _regex_token_iterator_.
- #include <iostream>
- #include <boost/xpressive/xpressive.hpp>
- using namespace boost::xpressive;
- int main()
- {
- std::string str( "Eric: 4:40, Karl: 3:35, Francesca: 2:32" );
- // find a race time
- sregex time = sregex::compile( "(\\d):(\\d\\d)" );
- // for each match, the token iterator should first take the value of
- // the first marked sub-expression followed by the value of the second
- // marked sub-expression
- int const subs[] = { 1, 2 };
- sregex_token_iterator cur( str.begin(), str.end(), time, subs );
- sregex_token_iterator end;
- for( ; cur != end; ++cur )
- {
- std::cout << *cur << '\n';
- }
- return 0;
- }
- This program outputs the following:
- [pre
- 4
- 40
- 3
- 35
- 2
- 32
- ]
- \n
- [link boost_xpressive.user_s_guide.examples top]
- ----
- [h4 Split a string using a regex as a delimiter]
- The following program takes some text that has been marked up with html and strips
- out the mark-up. It uses a regex that matches an HTML tag and a _regex_token_iterator_
- that returns the parts of the string that do ['not] match the regex.
- #include <iostream>
- #include <boost/xpressive/xpressive.hpp>
- using namespace boost::xpressive;
- int main()
- {
- std::string str( "Now <bold>is the time <i>for all good men</i> to come to the aid of their</bold> country." );
- // find a HTML tag
- sregex html = '<' >> optional('/') >> +_w >> '>';
- // the -1 below directs the token iterator to display the parts of
- // the string that did NOT match the regular expression.
- sregex_token_iterator cur( str.begin(), str.end(), html, -1 );
- sregex_token_iterator end;
- for( ; cur != end; ++cur )
- {
- std::cout << '{' << *cur << '}';
- }
- std::cout << '\n';
- return 0;
- }
- This program outputs the following:
- [pre
- {Now }{is the time }{for all good men}{ to come to the aid of their}{ country.}
- ]
- \n
- [link boost_xpressive.user_s_guide.examples top]
- ----
- [h4 Display a tree of nested results]
- Here is a helper class to demonstrate how you might display a tree of nested results:
- // Displays nested results to std::cout with indenting
- struct output_nested_results
- {
- int tabs_;
- output_nested_results( int tabs = 0 )
- : tabs_( tabs )
- {
- }
- template< typename BidiIterT >
- void operator ()( match_results< BidiIterT > const &what ) const
- {
- // first, do some indenting
- typedef typename std::iterator_traits< BidiIterT >::value_type char_type;
- char_type space_ch = char_type(' ');
- std::fill_n( std::ostream_iterator<char_type>( std::cout ), tabs_ * 4, space_ch );
- // output the match
- std::cout << what[0] << '\n';
- // output any nested matches
- std::for_each(
- what.nested_results().begin(),
- what.nested_results().end(),
- output_nested_results( tabs_ + 1 ) );
- }
- };
- [link boost_xpressive.user_s_guide.examples top]
- [endsect]
|