Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
簡易正規表現ライブラリラッパ
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 新規作成