OnigPP

提供:やる気向上作戦
移動: 案内, 検索

メインページ


※ここは、Windows用のpthreadについて解説したページではありません。Windows用のpthreadをお求めの方は、POSIX Threads for Win32へどうぞ。


目次

概要

Kosako様作マルチバイトエンコーディング対応正規表現ライブラリ「Oniguruma」のC++ラッパー


特長?

java.util.regex.Pattern java.util.regex.Matcher のぱくり。


使い方

#include <onigpp/onigpp.h>
#include <string>
#include <iostream>
using namespace onigpp;
 
int main(int argc, char** argv)
{
OnigInitializer onit; // ライブラリ初期化
{
std::string pattern = "foo"; // パターン
std::string target = "foobarbaz foolish junkfood"; // 対象文字列
 
// パターンオブジェクトを構築
OnigPattern pat(pattern.c_str(), pattern.c_str()+pattern.length());
// マッチャーオブジェクトを構築
OnigMatcher* m = pat.matcher(target.c_str(), target.c_str()+target.length());
 
// マッチする部位を検索し、表示する。
while (m->find()) {
std::cout << m->group() << std::endl;
}
 
// マッチャーを削除
delete m;
}
return 0;
}

ダウンロード

おまけ

同梱のonig.dllは、OnigurumaのFAQに従い、スレッドセーフになるようコンパイルしたDLL。

変更点は以下のとおり。

regint.h

#include <windows.h>
#define USE_MULTI_THREAD_SYSTEM
extern CRITICAL_SECTION gOnigMutex;
#define THREAD_SYSTEM_INIT InitializeCriticalSection(&gOnigMutex)
#define THREAD_SYSTEM_END DeleteCriticalSection(&gOnigMutex)
#define THREAD_ATOMIC_START EnterCriticalSection(&gOnigMutex)
#define THREAD_ATOMIC_END LeaveCriticalSection(&gOnigMutex)
#define THREAD_PASS Sleep(0)

regcomp.c

CRITICAL_SECTION gOnigMutex; //これ追加

おまけ2

前項はWindowsにおける実装だが、Posix準拠のプラットフォームでは以下のようにすればスレッドセーフになると思われる(未確認)。

regint.h

#include <pthread.h>
#include <sched.h>
#define USE_MULTI_THREAD_SYSTEM
extern pthread_mutex_t gOnigMutex;
#define THREAD_SYSTEM_INIT pthread_mutex_init(&gOnigMutex, NULL)
#define THREAD_SYSTEM_END pthread_mutex_destroy(&gOnigMutex)
#define THREAD_ATOMIC_START pthread_mutex_lock(&gOnigMutex)
#define THREAD_ATOMIC_END pthread_mutex_unlock(&gOnigMutex)
#define THREAD_PASS sched_yield()

regcomp.c

pthread_mutex_t gOnigMutex;
個人用ツール