jregex_sample.cpp

#include "langedge/win_support.hpp"

#include <iostream>
#include <string>
using namespace std;

// 正規表現のインタフェースを宣言しているファイル
#include "langedge/jre_util.hpp"

// release() メソッドを持つインタフェース用のスマートポインタ
#include "langedge/remote_ptr.hpp"

using langedge::jregex::JRegexLoader;
using langedge::jregex::TheJRegexLoader;
using langedge::jregex::JRegexIF;
using langedge::jregex::JREMatchRange;
using langedge::jregex::JRECache;
using langedge::jregex::JREMatcher;
using langedge::jregex::JRegMatch;
using langedge::jregex::JRegSubst;
using langedge::RemotePtr;

// DLL_PATH を定義
#ifndef NDEBUG
#define DLL_PATH "..\\..\\..\\build\\win_debug\\bin\\lei_jregex.dll"
#else
#define DLL_PATH "..\\..\\..\\build\\win_release\\bin\\lei_jregex.dll"
#endif

// 正規表現DLLのパスを設定しておく
void jregex_dll_path()
{
    TheJRegexLoader::dllPath( DLL_PATH );
}

// langedge::jregex::JRegexLoader と langedge::jregex::JRegexIF を使用する例
void jregex_sample_1()
{
    // DLLローダ
    JRegexLoader& jreLoader = TheJRegexLoader::getLoader();

    // パターンから正規表現インスタンス(オブジェクト)を作成
    RemotePtr<JRegexIF> pjre( jreLoader.createInstance( "foo" ) );

    if (pjre->succeeded()) {
        // パターンコンパイルに成功
        if (pjre->regexec( "a foo bar", 0 )) {
            // パターンマッチに成功

            // パターンにマッチした範囲を得る
            JREMatchRange rm = pjre->getMatchedRange( 0 );
            cout << "match: [" << rm.begin << " - " << rm.end << "]" << endl;
        }
    }

    // 正規表現オブジェクトは、スマートポインタの破棄時に release() が呼ばれて
    // 自動的に解放される
}

// langedge::jregex::JRECache を使用する
void jregex_sample_2()
{
    // DLLローダ
    JRegexLoader& jreLoader = TheJRegexLoader::getLoader();

    // 正規表現キャッシュを作成
    JRECache reCache( &jreLoader );

    // とあるパターンと文字列に対してパターンマッチを実行する
    // C++ ソースで、直接パターン文字列を記述する場合は、
    // \s を指定するのに \\s と書くことに注意
    JRegexIF* pReg = reCache.regMatch( "foo\\s+bar", "hoge foo bar fuga!" );
    if ( pReg ) {
        cout << "begin: "  << pReg->getMatchedRange(0).begin    << endl;
        cout << "end: "    << pReg->getMatchedRange(0).end      << endl;
        cout << "length: " << pReg->getMatchedRange(0).length() << endl;
    }
    // pReg を delete または release してはいけない!

    // とあるパターンと文字列に対してパターン置換を実行する
    string result;
    pReg = reCache.regSubst( "/foo/bar/ig", "foo Foo FOO!", result );
    if ( pReg ) {
        cout << "result: " << result << endl;
    }
    // pReg を delete または release してはいけない!
}

// langedge::jregex::JREMatcher を使用する例
void jregex_sample_3()
{
    // DLLローダ
    JRegexLoader& jreLoader = TheJRegexLoader::getLoader();

    // 正規表現マッチャーを作成
    JREMatcher matcher(&jreLoader);

    // とあるパターンと文字列に対してパターンマッチを実行する
    // C++ ソースで、直接パターン文字列を記述する場合は、
    // \w を指定するのに \\w と書くことに注意
    if (matcher.match( "f\\w+o", "hoge foo bar fuga!" )) {
        cout << "match: " << matcher[0] << endl;
    }

    // 文字によるカッコ指定
    if (matcher.match( "({a}f\\w+o)\\s+bar", "hoge foo bar fuga!" )) {
        cout << "match[0]: " << matcher[0] << endl;
        cout << "match[a]: " << matcher['a'] << endl;
    }
}

// langedge::jregex::JRegMatch と langedge::jregex::JRegSubst を使用する例
void jregex_sample_4()
{
    // あらかじめ、 TheJRegexLoader::dllPath() を呼んで、
    // 正規表現DLLのパスを設定しておく必要がある。
    // 本例では、main() の先頭で jregex_dll_path() を呼んでいる。

    // とあるパターンと文字列に対してパターンマッチを実行する
    JRegexIF* pReg = JRegMatch( "foo\\s+bar", "hoge foo bar fuga!" );
    if ( pReg ) {
        cout << "begin: "  << pReg->getMatchedRange(0).begin    << endl;
        cout << "end: "    << pReg->getMatchedRange(0).end      << endl;
        cout << "length: " << pReg->getMatchedRange(0).length() << endl;
    }
    // pReg を delete または release してはいけない!

    // とあるパターンと文字列に対してパターン置換を実行する
    string result;
    pReg = JRegSubst( "/foo/bar/ig", "foo Foo FOO!", result );
    if ( pReg ) {
        cout << "result: " << result << endl;
    }
    // pReg を delete または release してはいけない!
}

int main()
{
    jregex_dll_path();
    jregex_sample_1();
    jregex_sample_2();
    jregex_sample_3();
    jregex_sample_4();

    return 0;
}

正規表現ライブラリ lei_jregexに対してWed May 11 15:29:31 2005に生成されました。  doxygen 1.4.2