|
秀まるお様
作成中の複雑なマクロを使ったため不要に混乱をもたらしてしまいました。すみませ
んでした。聞きたいのは下記マクロを実行すればわかる通り単純なことです。
下記マクロのように、何故半角大かっこ"]"はエスケープしてもしなくてもいいので
すか?
エスケープのかわりに大かっこで挟む方法は、手間のかからない実践的な方法ですが、
"[]]"で検索すると置換されないのは仕様ですか。一方で小かっこ「閉じる」は"[)]"
で置換ないし"\\\\)"でエスケープしておかないと文全体が置換されませんがこちら
が正しい仕様のような気がしました。何か理由があるのでしょうか?
//テスト用マクロ
//大かっこの場合
$text0 = "(95% confidence interval [CI], 0.79 to 1.15)";//元の文
loaddll "hmjre.dll";
//ここで "confidence interval [CI]"の部分が正しくは "accurate interval [AI]
" と分かったので入れ替えたい。
$text1 = "confidence interval [CI]"; //入れ替えたい部分
$text2 = "accurate interval [AI]"; //正しい文言
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
message "$text1 = " + $text1 + " に 「[」 や 「]」 があるので置
換に失敗しました。 \n$text3 = " + $text3 + "*中身なし*";
message "今度は $text1 の 「[」だけ をエスケープします。";
$s = dllfuncstr("ReplaceRegular", "\\[", $text1, 0, "\\\\[", 0);
if ($s == "") {message "$text1 の 「[」 のエスケープに失敗しました。"; endm
acro;}
$text1 = $s;
message "$text1 = " + $text1 + "\nこれで置換します。";
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
message "成功です! \n$text3 = " + $text3 + "\nでも 「]」はまだエスケー
プしてないですよね。\n 「]」 もエスケープしてみます。";
$s = dllfuncstr("ReplaceRegular", "\\]", $text1, 0, "\\\\]", 0);
if ($s == "") {message "$text1 の 「]」 のエスケープに失敗しました。"; endm
acro;}
$text1 = $s;
message "$text1 = " + $text1 + "\nこれで置換します。";
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
question "これも成功です! \n$text3 = " + $text3 + "\n「]」はまだエスケー
プしてもしなくても結果はおなじですね。
\n正しいエスケープの方法は\\\\\\\\をたくさんつけなくてはいけなくて分かりず
らいですね。
\n今度はエスケープではなく 大かっこ「[XXX]」で文字を囲む方法を取ってみま
しょう。 \n「いいえ」で終了します。";
if (!result) endmacro;
$text1 = "confidence interval [CI]";
$text2 = "accurate interval [AI]"; //正しい文言
message "今度は $text1 = " + $text1 + " の 「[」だけ を「 [[] 」
に置換します。";
$text1 = dllfuncstr("ReplaceRegular", "([\\[])", $text1, 0, "[\\1]", 2);
message "$text1 = " + $text1 + "\nこれで置換します。";
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
message "成功です! \n$text3 = " + $text3 + "\nでも 「]」はまだ「[]]」に
置換してないですよね。\n 「]」 も置換してみます。";
$text1 = "confidence interval [CI]"; //入れ替えたい部分
$text1 = dllfuncstr("ReplaceRegular", "([\\[\\]])", $text1, 0, "[\\1]", 2);
message "$text1 = " + $text1 + "\nこれで置換します。";
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
question "これは失敗です。 \n$text3 = " + $text3 + "\n「]」は置換してはい
けないのですね。なぜだろう? \n「いいえ」で終了です。";
if (!result) endmacro;
message "小かっこの場合はどうでしょうか?試してみましょう。";
//小かっこの場合
$text0 = "(95% confidence interval (CI), 0.79 to 1.15)";//元の文
loaddll "hmjre.dll";
//ここで "confidence interval [CI]"の部分が正しくは "accurate interval [AI]
" と分かったので入れ替えたい。
$text1 = "confidence interval (CI)"; //入れ替えたい部分
$text2 = "accurate interval (AI)"; //正しい文言
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
message "$text1 = " + $text1 + " に 「(」 や 「)」 があるので置
換に失敗しました。 \n$text3 = " + $text3 + "*中身なし*";
message "今度は $text1 の 「(」だけ をエスケープします。";
$s = dllfuncstr("ReplaceRegular", "\\(", $text1, 0, "\\\\(", 0);
if ($s == "") {message "$text1 の 「(」 のエスケープに失敗しました。"; endm
acro;}
$text1 = $s;
message "$text1 = " + $text1 + "\nこれで置換します。";
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
message "失敗です。 \n$text3 = " + $text3 + "\n「)」をまだエスケープして
ないためかもしれませんね。\n 「)」 もエスケープします。";
$s = dllfuncstr("ReplaceRegular", "\\)", $text1, 0, "\\\\)", 0);
if ($s == "") {message "$text1 の 「)」 のエスケープに失敗しました。"; endm
acro;}
$text1 = $s;
message "$text1 = " + $text1 + "\nこれで置換します。";
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 0);
message "今度は成功です! \n$text3 = " + $text3+"\n小かっこの場合は両方エス
ケープしないといけないんですね。なんかちぐはぐですね。";
$text0 = "(95% confidence interval [CI], 0.79 to 1.15)";//元の文
$text2 = "(95% accurate interval [AI], 0.79 to 1.15)"; //正しい文
$text1 = $text0;//$text0全体を入れ替えるのでコピーしておきます。
$text1 = dllfuncstr("ReplaceRegular", "([()\\[])", $text1, 0, "[\\1]", 2);
message "最後には 小かっこも大かっこもある場合で見てみましょう \n元の文 $
text0 = " + $text0 + "\n正しい文 $text2 = " + $text2 +
"\n置換後の検索文 $text1 = " + $text1;
$text3 = dllfuncstr("ReplaceRegular", $text1, $text0, 0, $text2, 2);
message "成功です! \n$text3 = " + $text3 + "\n「]」は放置したので一発で
置換できました。こういう仕様なんでしょうか? 大かっこ[XXX]で挟むのは邪道とい
うことでしょうか?";
endmacro;
|
|