I've been using Xpressive and think it's great. But, I think
the following program shows two problems.
Problem 1: You get
a runtime error if you uncomment the line "std::wcout <<
what2.position(0) << L'\n';"
Problem 2: I think it should output:
This is my face
is
my
face
But it actually outputs:
This is
is
Note that if you replace the nested regular expression with
the (commented out) non-nested one, it still outputs the wrong thing. It
outputs "This is" instead of "This is my face."
Here is the program. Thanks for your help.
#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 subtokens = +alnum;
wsregex token = as_xpr(L"This
") >> subtokens;
// wsregex token = as_xpr(L"This ") >>
+alnum; // Also outputs the wrong thing
wsregex_iterator cur( str.begin(),
str.end(), token );
wsregex_iterator end;
for( ; cur != end; ++cur )
{
wsmatch const
&what = *cur;
std::wcout
<< what.str(0) << L'\n';
wsmatch::nested_results_type::const_iterator cur2 =
what.nested_results().begin();
wsmatch::nested_results_type::const_iterator end2 =
what.nested_results().end();
for ( ; cur2 !=
end2; ++cur2) {
wsmatch const &what2 = *cur2;
std::wcout << what2.str(0) << L'\n';
//
std::wcout << what2.position(0) << L'\n'; // CAUSES RUNTIME ERROR
}
}
std::cout << "\n\n"
<< std::flush;
return 0;
}