C++で正規表現 (3)
王道であるBoost.Regex(version 1.33.1)を使ってみた。
このCRegexの使い方は(1)と同じで、
という感じ。以下Regex.hのソース。
CRegex Regex( "(abc)(def)ghi" );
int nResults = Regex.Match( "abcdefghijkl" );
以下Regex.cpp。
#includeclass CRegex {
// boost::reg_expressionm_regex; // ver. 1.30 or earlier
boost::basic_regexm_regex; // ver. 1.31 or later
boost::match_resultsm_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;
};
VC++6.0の場合(Boostに使うのが間違いという話もあるが)
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 ];
}
としないとビルドできないようだ。(参考: id:NIES:20050209)