C++で正規表現 (5)

(有)ラング・エッジの正規表現ライブラリlei_jregexを試してみた。
SJISEUCに対応している。初期化時の関数名はCOMライクとなっている。

以下Regex.h。


class CRegex {
void *m_regex;
public:
CRegex( const char *pszExpression );
~CRegex();
bool Match( const char *pszTarget );
bool GetPosition( int nIndex, int &nStart, int &nEnd ) const;
};
以下Regex.cpp。

#include "langedge/jre_util.hpp"
#include "regex.h"

using langedge::jregex::JRegexLoader;
using langedge::jregex::TheJRegexLoader;
using langedge::jregex::JRegexIF;
using langedge::jregex::JREMatchRange;

CRegex::CRegex( const char *pszExpression )
: m_regex( NULL )
{
// DLLローダ
try {
JRegexLoader& jreLoader = TheJRegexLoader::getLoader();
m_regex = jreLoader.createInstance( pszExpression );
} catch ( langedge::DllLoaderException & ) {
};
}

CRegex::~CRegex()
{
if ( m_regex ) {
((JRegexIF *)m_regex)->release();
}
}

bool CRegex::Match( const char *pszTarget )
{
if ( m_regex == NULL || ((JRegexIF *)m_regex)->failed() ) {
return false;
}
return ((JRegexIF *)m_regex)->regexec( pszTarget, 0 );
}

bool CRegex::GetPosition( int nIndex, int &nStart, int &nEnd ) const
{
if ( m_regex == NULL || ((JRegexIF *)m_regex)->failed() ) {
return false;
}
JREMatchRange rm = ((JRegexIF *)m_regex)->getMatchedRange( nIndex );
if ( rm.begin < 0 ) {
return false;
}
nStart = rm.begin;
nEnd = rm.end;
return true;
}

以下サンプル。一致した数を調べるI/Fはないようだ(見つけられなかった)。

#include
#include "regex.h"
#include "langedge/jre_util.hpp"
...
langedge::jregex::TheJRegexLoader::dllPath( "lei_jregex.dll" );

std::string strTarget = "abcdefghijkl";
CRegex Regex( "(abc)(def)ghi" );
int nResults = Regex.Match( strTarget.c_str() );
int i;
for ( i = 0; i < 3; ++i ) {
int nStart, nEnd;
Regex.GetPosition( i, nStart, nEnd );
std::cout << "result(" << i << "): ";
std::cout << strTarget.substr( nStart, nEnd ) << std::endl;
}