C++で正規表現 (3)

王道であるBoost.Regex(version 1.33.1)を使ってみた。
このCRegexの使い方は(1)と同じで、


CRegex Regex( "(abc)(def)ghi" );
int nResults = Regex.Match( "abcdefghijkl" );
という感じ。以下Regex.hのソース。

#include

class CRegex {
// boost::reg_expression m_regex; // ver. 1.30 or earlier
boost::basic_regex m_regex; // ver. 1.31 or later
boost::match_results m_results;

public:
CRegex( const char *pszExpression ) : m_regex( pszExpression ) { }
~CRegex() { }
int Match( const char *pszTarget );
bool GetPosition( int nIndex, int &nStart, int &nEnd ) const;
std::string GetResult( int nIndex ) const;
};

以下Regex.cpp。

int CRegex::Match( const char *pszTarget )
{
if ( !boost::regex_search( pszTarget, m_results, m_regex ) ) {
return 0;
}
return m_results.size();
}

bool CRegex::GetPosition( int nIndex, int &nStart, int &nEnd ) const
{
if ( nIndex < 0 || nIndex >= m_results.size() ) {
return false;
}
nStart = m_results.position( nIndex );
nEnd = m_results.position( nIndex ) + m_results.length( nIndex );
return true;
}

std::string CRegex::GetResult( int nIndex ) const
{
if ( nIndex < 0 || nIndex >= m_results.size() ) {
return "";
}
return m_results[ nIndex ];
}

VC++6.0の場合(Boostに使うのが間違いという話もあるが)

  • デバッグ時、プリコンパイルドヘッダと簡易リビルドを無効にする
  • リリース時、「プログラムサイズ」で最適化するように設定する

としないとビルドできないようだ。(参考: id:NIES:20050209)