簡易正規表現ライブラリラッパ by kanegon 1. 概要 VBScript 5.0 (IE5.0) からサポートされた正規表現オブジェクトは ActiveX のコン ポーネントになっているため、他の言語からも利用可能な仕組みになっています。 しかし、正規表現オブジェクトの ActiveX のコンポーネントを直接使うのは若干面倒 な記述が必要な上、空文字列とのマッチで NULL を返すなど、余分な考慮が必要になり ます。 このクラスは上記問題を解決し、正規表現オブジェクトを C++ からより簡単に利用す るためのラッパクラスです。 2. 使い方 以下のソースを直接コピーして使用してください。 SimpleRegExp.h SimpleRegExp.cpp xstr.h xstr.cpp vbscript_regexp_55.tlb 2. 対応コンパイラ 確認済み VC++ 2008 VC++ 6.0 VC++ 6.0 以降ならたぶん使えるはず 3. クラス 3.1 クラス名 SimpleRegExp 3.2 メンバ一覧 Test パターンマッチ(一致不一致のみ) Match パターンマッチ(詳細情報取得) Replace 文字列置換 GetMatchCount 一致数の取得 (Match に依存) SelectMatch 一致箇所の選択 (Match に依存) GetMatchText 一致文字列の取得 (Match に依存) 3.3 メンバ詳細 - Test 対象文字列と正規表現とのパターンマッチを行い、結果を BOOL で返却します。 BOOL Text(LPCTSTR pszText, LPCTSTR pszRegExp, LPCTSTR pszRegExpOption=NULL) pszText 評価対象文字列 pszRegExp 正規表現文字列 pszRegExpOption 正規表現オプション("i", "m" またはその組み合わせが指定可能) 例) SimpleRegExp re; if (re.Text(_T("ABC123"), _T("[a-z][0-9]+"), _T("i"))) { // 一致 } else { // 不一致 } - Match 対象文字列と正規表現とのパターンマッチを行い、結果を BOOL で返却します。 パターンマッチに成功した場合、結果詳細をインスタンスとして保持します。 BOOL Match(LPCTSTR pszText, LPCTSTR pszRegExp, LPCTSTR pszRegExpOption=NULL) pszText 評価対象文字列 pszRegExp 正規表現文字列 pszRegExpOption 正規表現オプション("i", "g", "m" またはその組み合わせが指定可能) 例) 単一マッチ ("g" オプションなし) SimpleRegExp re; if (re.Match(_T("ABC123"), _T("([a-z])([0-9]+)"), _T("i"))) { // 一致 // パターンマッチの結果取得 _tprintf(_T("%s\n"), re.GetMatchText(0).c_str()); // 一致文字列の全体 _tprintf(_T("%s\n"), re.GetMatchText(1).c_str()); // 1番目のカッコに対応 _tprintf(_T("%s\n"), re.GetMatchText(2).c_str()); // 2番目のカッコに対応 } else { // 不一致 } 出力結果 -------------------- C123 C 123 -------------------- 例) 複数マッチ ("g" オプションあり) SimpleRegExp re; if (re.Match(_T("ABC123XYZ789"), _T("([a-z])([0-9]+)"), _T("ig"))) { // 一致 int match_count = re.GetMatchCount(); // 一致した回数を取得 for (int i = 0; i < match_count; i++) { re.SelectMatch(i)); // 指定した一致情報を選択 _tprintf(_T("%s\n"), re.GetMatchText(0).c_str()); // 一致文字列の全体 _tprintf(_T("%s\n"), re.GetMatchText(1).c_str()); // 1番目のカッコに対応 _tprintf(_T("%s\n"), re.GetMatchText(2).c_str()); // 2番目のカッコに対応 } } else { // 不一致 } 出力結果 -------------------- C123 C 123 Z789 Z 789 -------------------- - Replace 対象文字列と正規表現とのパターンマッチを行い、一致箇所を指定した文字列で置 換します。置換した内容を文字列として返却します。 xstr_t Replace(LPCTSTR pszText, LPCTSTR pszReplace, LPCTSTR pszRegExp, LPCTSTR pszRegExpOption=NULL) pszText 対象文字列 pszReplace 置換文字列 pszRegExp 正規表現文字列 pszRegExpOption 正規表現オプション("i", "g", "m" またはその組み合わせが指定可能) 例) SimpleRegExp re; xstr_t strNewText = re.Replace(_T("ABC123XYZ789"), _T("$1$1$1"), _T("([a-z])[0-9]+"), _T("ig"))) { _tprintf(_T("%s\n"), strNewText.c_str()); 出力結果 -------------------- ABCCCXYZZZ -------------------- - GetMatchCount パターンマッチで一致した箇所の数を返却します。オプション "g" を付加しない 場合、必ず 1 を返します。 Match() が成功した場合のみ有効です。 int GetMatchCount() 例) Match の例を参照 - SelectMatch オプション "g" を使用して、複数個所で一致した場合、インデックスを指定して 特定の一致箇所を選択します。選択した情報は GetMatchText() に影響します。 選択に失敗した場合、FALSE を返します。 Match() が成功した場合のみ有効です。 BOOL SelectMatch(int index) index 一致箇所のインデックス 例) Match の例を参照 - GetMatchText パラメタに 0 を指定した場合、一致文字列全体を返却します。 パラメタに 1 以上の値を指定した場合、カッコで指定したグループの情報を返却します。 オプション "g" を使用して、複数個所で一致した場合、操作対象はあらかじめ SelectMatch() で選択します。 Match() が成功した場合のみ有効です。 xstr_t GetMatchText(int index) index 対象グループ 例) Match の例を参照 4. 補足 xstr_t は std::basic_string と一部互換のある独自の文字列クラスです。 xstr_t を使用しているのは作者の都合であり、それ以上の意味はありません。 コンパイルオプションで /DUSE_STD_STRING を指定することで、xstr_t を std::basic_string に差し替えて使用することができます。 このクラスは正規表現を簡単に使うことを目的としています。 宣言1行、判定1行で正規表現を使用できますが、その代わりコンパイルした正規表現 オブジェクトの使いまわしなど、性能に関する考慮はありません。 5. 使用条件 ご自由にどうぞ。 本プログラムおよびソースコードは無保証です。 本プログラムおよびソースコードの使用において生じた如何なる損害についても作者 は一切の責任を負いません。 6. 修正履歴 2009.04.26 新規作成