2009年1月22日木曜日

boost::xpressive サンプル

 vc8 から vc9 へ移行しようと思うと、atlrx.h が見つからない。という訳で正規表現の関係を書き直すはめに…。ちなみに、afxisapi.h が無くなっていて、オープンソース化した atlisapi.h を使えというひどい対応により、移行は実現できないでいる。そんなこんなで、boost::xpressive なのだ…。


#include <iostream>
#include <string>
#include <boost/xpressive/xpressive.hpp>

bool separate_word(
const char* parse, //!< [in] 節の正規表現文字列
const std::string& src, //!< [in] 文
std::string& before, //!< [out] 節の前文
std::string& sep, //!< [out] 節
std::string& after //!< [out] 節の後文
) {
boost::xpressive::sregex rex = boost::xpressive::sregex::compile( parse );
boost::xpressive::smatch what;
if( !boost::xpressive::regex_search( src, what, rex, boost::xpressive::regex_constants::match_any ) ) return false;
before = src.substr( 0, what.position(0) );
after = src.substr( what.position(0) + what.length(0) );
sep = what[0];
return true;
}

int main(void) {

std::string src = "select() d,e,f from (select a, b, c from hiho (Where) anywheresql=5 order by a ) where moge=3";
const char* parse[] = {
"\\b(?i:order +by)\\b",
"[^\\ \\(\\)\\,]+",
"\\b(?i:where)\\b"
};

for( int i = 0; i < 3; ++i ) {
std::string bef, aft, sep;
separate_word( parse[i], src, bef, sep, aft );
std::cout << ">>>>" << std::endl;
std::cout << bef << std::endl << sep << std::endl << aft << std::endl;
}
std::cout << "===============" << std::endl;
boost::xpressive::sregex reg = boost::xpressive::sregex::compile( " +" );
boost::xpressive::sregex_token_iterator cur( src.begin(), src.end(), reg, -1 );
boost::xpressive::sregex_token_iterator end;
while( cur != end ) {
std::cout << *cur << std::endl;
++cur;
}
std::cout << "---------------" << std::endl;

return 0;
}

0 件のコメント: