C++(stl)の正規表現(std::regex_search)について、質問させてください。
今、私がやりたいと思っていることは、
正規表現をつかって1行の文字列を検索し、特定のパターンにマッチする複数の、全ての文字列を出力したい、
というものですが、マッチングは成功するものの、その後の出力が期待通りでなく、悩んでいます。
まず、環境は以下の通りです。
----------------------------------------------------------------------------------------
OS:Windows7 64bit
開発環境:Visual studio C++ 2010 Express Edition
使用ライブラリ:DXライブラリ(バージョン 3.11)
DXライブラリを使用している理由は、
現在ゲームを開発中で、そのゲームの処理内で上記マッチングをしたいからです。
----------------------------------------------------------------------------------------
前置きが長くなりましたが、本題です。
検索する全体文字列は、以下の1Byte文字だけで構成された(ちょっと変な)英文です。
IF(You love DXLib) AND(CPlusPlus) THEN(Create Funny Games!)
上記の英文から、"IF(○○)"と、"AND(○○)"と、"THEN(○○)" を取得して、表示したく、
マッチングパターンとして以下を考えましたが、"IF(○○)"しか表示できず、解決策に困っています。
以下、ソースコードとなります(実行に必要なミニマムなコードです)。
(1)まず、どこがまずいのでしょうか?
私はマッチングパターンが悪いのだと考えていますが、なぜ悪いのかがわかりません。
(2)次に、では、どのようにすれば、"IF(○○)"と、"AND(○○)"と、"THEN(○○)" を全て表示できるのでしょうか?
これはひょっとして、答えを教えてくださいと言ってるのと同じかもしれませんので、
本掲示板の規約に対して差支えるようでしたら、なにかヒントのような形でも教えていただければ幸いです。
※現在は、他のライブラリ(boostなど)の導入は検討しておらず、stlだけでなんとかできれば・・・と考えてます。
どうか皆様、お知恵をお貸しください。よろしくお願いします。
#include "DxLib.h"
#include <regex>
#include <string>
using namespace std ;
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
// ウィンドウモードにする
ChangeWindowMode( TRUE ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 ){ return -1 ; }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 文字列の中から、正規表現を使って、
// "IF(○○)"と、"AND(○○)"と、"THEN(○○)"を表示させたい
//
// 【文字列】
// IF(You love DXLib) AND(CPlusPlus) THEN(Create Funny Games!)
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 検索対象の文字列
const string target = "IF(You love DXLib) AND(CPlusPlus) THEN(Create Funny Games!)" ;
// 正規表現の検索パターン「IF(○○)やAND(○○)やTHEN(○○)」までを1セットとして扱う
string searchStr = "[A-Z]+\\(.{1,20}\\)" ;
// 正規表現の検索パターン用オブジェクトを生成
std::regex searchPattern( searchStr ) ;
// 正規表現マッチング結果を格納するオブジェクトを宣言
std::match_results<const char *> matchResult ;
// マッチングする
bool isMatched = std::regex_search( target.c_str(), matchResult, searchPattern ) ;
// 以下、マッチした場合の処理
if( isMatched )
{
// 表示する文字色(白)で初期化
int fontColor = GetColor( 255, 255, 255 ) ;
// 表示位置(Y座標)を初期化
int drawPosY = 0 ;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 「IF(You love DXLib)」しか表示されない・・・orz
// 「AND(CPlusPlus)」やTHEN(Create Funny Games!)はどうやれば拾えるのか??
// 正規表現の検索パターンが悪いのだと思うけれど、どう直せばよいのか??
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 正規表現マッチング結果をひとつずつ取り出す
std::match_results<const char *>::const_iterator it = matchResult.begin() ;
while( it != matchResult.end() )
{
if( it->matched )
{
// マッチした文字列を取得する
string matchedStr = it->str() ;
// 表示位置を毎回30ピクセルずつ下に下げる
drawPosY += 30 ;
// 画面に表示する
DrawString( 240 , drawPosY , matchedStr.c_str() , fontColor );
}
++it ;
}
}
// キー入力待ち
WaitKey() ;
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
ものすごく堅苦しい言葉づかいで、理解しづらい文面になってしまったかもしれません・・・お許しください(^^;