文字列の判定ScenarioModでは、メッセージ内容で状況を判定することもあるため、 このため、「簡単な部分一致」と「あいまいな部分一致」をするための2つの関数が用意されています。 使い所をいちはやく知りたい場合
吹き出しメッセージなどが実行される直前用途のイベントハンドラ、 BOOL Is_文字列マッチ( string 対象文字列, string 部分文字列);という、「対象文字列」に「部分文字列」が含まれているのか? ScenarioModでは「文字列中に~が含まれる」は頻繁に利用されるため、 if (Is_文字列マッチ("あいうえお", "いう")) { デバッグ出力 << "'あいうえお' という文字列には 'いう'が含まれます" << endl; } 元々C++のstring型にて、部分文字列とマッチしているかどうかは if ( 元メッセージ.find("aaa") != string::npos ) { ~ } などと記述していたのを if ( Is_文字列マッチ(元メッセージ , "aaa") ) ~ } などと記述しても良いということになります。 この関数は、次に説明するIs_正規表現マッチの関数と表記を合わせたものとなります。 BOOL Is_正規表現マッチ(string 対象文字列, string 正規表現文字列, 正規表現マッチ結果型* 正規表現マッチ結果 = NULL);正規表現による文字列判定用の関数。
これにより、完全な決め打ちできないメッセージをあいまいなまま取り扱うことが出来るようになった。 例①if (Is_正規表現マッチ("あいうえお", "いう.+")) { デバッグ出力 << 'あいうえお' という文字列は 'いう' という文字列 と「その後ろに何か1文字以上の文字」を 含んでいる << endl; } 例②string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) { if (Is_正規表現マッチ(元メッセージ, "米を.+?ほど\\s売")) { デバッグ出力 << 元メッセージ << endl; } // 変更しない場合"" return ""; } 例③string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) { if (Is_正規表現マッチ(元メッセージ, "^他.+[米馬鉄砲]+を[0-9]+ほど\\s売" )) { デバッグ出力 << 元メッセージ << endl; } // 変更しない場合"" return ""; } 例④:詳細なマッチ結果を得る
正規表現マッチ結果型 マッチ結果; if ( Is_正規表現マッチ(元メッセージ, "\\s(.+)を(\\d+?)ほど", &マッチ結果 ) ) { デバッグ出力 << マッチ結果[0] << ":" << マッチ結果[1] << ":" << マッチ結果[2] << endl; } この例であれば、元のメッセージが「「他でもない[改行]米を1100ほど[改行]売りたいのじゃ」というメッセージだった場合、
より詳細を知るには...「文字列の判定・正規表現」に関する主な所は以上となります。 詳しくは「メッセージ関連情報型.h」などを参照してください。 |