文字列の判定

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 "";
}

例④:詳細なマッチ結果を得る

  • 正規表現マッチ結果型 」 の変数を用意すると、 (下の例なら「マッチ結果」という変数名)
    詳細なマッチ情報が得られる。
  • マッチ結果[1]のように番号でアクセスする。中身は文字列。
  • 0番目がマッチした部分の文字列全体。
  • 1番目以降が( )でくくった部分にマッチした文字列が順次格納される。
  • 存在しない「番号」にアクセスした場合は、空の文字列相当である「""」が返ってくる。
	正規表現マッチ結果型 マッチ結果;
	if ( Is_正規表現マッチ(元メッセージ, "\\s(.+)を(\\d+?)ほど", &マッチ結果 ) ) {
		デバッグ出力 << マッチ結果[0] << ":" << マッチ結果[1] << ":"  << マッチ結果[2] <<  endl;
	}

この例であれば、元のメッセージが「「他でもない[改行]米を1100ほど[改行]売りたいのじゃ」というメッセージだった場合、

  • マッチ結果[0]は、「[改行]米を1100ほど」となる。
  • マッチ結果[1]は、1番目の( )の中身なので、「米」となり、
  • マッチ結果[2]は、2番目の( )の中身なので、「1100」という文字列となる。

より詳細を知るには...

「文字列の判定・正規表現」に関する主な所は以上となります。 詳しくは「メッセージ関連情報型.h」などを参照してください。