最終更新日 2024-09-25

文字列の判定

ScenarioModでは、メッセージ内容で状況を判定することもあるため、
文字列Aに部分文字列Bが含まれているのか? といった「部分文字列の一致」判定をすること比較的頻繁にあります。

このため、「簡単な部分一致」と「あいまいな部分一致」をするための2つの関数が用意されています。

使い所をいちはやく知りたい場合

吹き出しメッセージなどが実行される直前用途のイベントハンドラ、
On_噴出メッセージ直前 を参照してください。 や 「追認するのみ」のダイアログにおいてボタンを押した際に実行されるイベントハンドラ On_追認系ダイアログ確認時 を参照してください。

BOOL Is_文字列マッチ( string 対象文字列, string 部分文字列);

という、「対象文字列」に「部分文字列」が含まれているのか?
を簡単に判定する関数です。

ScenarioModでは「文字列中に~が含まれる」は頻繁に利用されるため、
string型 でも char *型 でも放り込める点で、strstrよりも便利でしょう。

if (Is_文字列マッチ("あいうえお", "いう")) {
	デバッグ出力 << "'あいうえお' という文字列には 'いう'が含まれます" << endl;
}

元々C++のstring型にて、部分文字列とマッチしているかどうかは

if ( 元メッセージ.find("aaa") != string::npos ) {
  ~
}

などと記述していたのを

if ( Is_文字列マッチ(元メッセージ , "aaa") )
  ~
}

などと記述しても良いということになります。

この関数は、次に説明するIs_正規表現マッチの関数と表記を合わせたものとなります。

BOOL Is_正規表現マッチ(string 対象文字列, string 正規表現文字列, 正規表現マッチ結果型* 正規表現マッチ結果 = NULL);

正規表現による文字列判定用の関数。
ほとんどのプログラミング言語(C++,C#,JavaScript,pythonなどなど)と比較的類似している。

これにより、完全な決め打ちできないメッセージをあいまいなまま取り扱うことが出来るようになった。
また、部分的にマッチした文字列を抽出することも格段にしやすくなった。

以下のように利用する。

例①


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」などを参照してください。