|
こんにちわ,rosegardenです.
"FindGeneral" であいまい検索指定をし、極めて特殊な場合におこる問題です。
dllfunc( "FindGeneral", 0, 1, 1, $S2, $S1, 0); //正規表現+あいまい検索
2回目の開始位置を一度ヒットした文字列のすぐ後ろに指定した時に発見しました。
下記のとおり、再現は容易ですが、どういう場合に問題がおきるのかは不明です。ど
う対処したらよいでしょうか。
V8.01 β10 (hmjre.dll V3.22)
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////
loaddll "hmjre.dll";
//例 1-1 (正常) 検索開始位置(0), ヒット位置(158)
$S1 = "「第一選択の」「ドパミン」「と」「ノルエピネフリン」は,いずれも有効性が評価
されており,「ショックの治療」における「第一選択の」「ノルエピネフリン」「と」「ドパ
ミン」はどちらも「昇圧薬」として「推奨」されることとした.";
$S2 = "(「.+?」)+として";
##prev = 0;
while (1) {
##d = dllfunc( "FindGeneral", 0, 1, 1, $S2, $S1, 0);
question "例 1-1 (正常) 「いいえ」で break" + "\n##d = " + str(##d) + "\n$S2
= " + $S2 + "\n$S1 = " + $S1; if (!result) break;
if (##d < 0) break;
}
//例 1-2 (異常) 検索開始位置を本来ヒットする位置(158)より後方(172)セットして
も ヒットし、その結果ループする例)
$S1 = "「第一選択の」「ドパミン」「と」「ノルエピネフリン」は,いずれも有効性が評価
されており,「ショックの治療」における「第一選択の」「ノルエピネフリン」「と」「ドパ
ミン」はどちらも「昇圧薬」として「推奨」されることとした.";
$S2 = "(「.+?」)+として";
##prev = 0;
while (1) {
##d = dllfunc( "FindGeneral", 0, 1, 1, $S2, $S1, 172);
question "例 1-2(異常) 「いいえ」で break" + "\n##d = " + str(##d) + "\n$S2=
" + $S2 + "\n$S1 = " + $S1; if (!result) break;
if (##d < 0) break;
}
//例 2 (正常) 「第一選択の」 ⇒ 第一選択の」 例1に対し最初の1文字"「"を削除し
ただけです.
$S1 = "第一選択の」「ドパミン」「と」「ノルエピネフリン」は,いずれも有効性が評価さ
れており,「ショックの治療」における「第一選択の」「ノルエピネフリン」「と」「ドパミ
ン」はどちらも「昇圧薬」として「推奨」されることとした.";
##i = 1;
$S2 = "(「.+?」)+として";
##prev = 0;
while (1) {
##d = dllfunc( "FindGeneral", 0, 1, 0, $S2, $S1, 172);
question "例 2 (正常)「はい」/「いいえ」どちらでもbreak" + "\n##d = " + str
(##d) + "\n$S2= " + $S2 + "\n$S1 = " + $S1; if (!result) break;
if (##d < 0) break;
}
//例 3 (正常) 例1に対し、文字列$S1は同じで、あいまい検索Flagを 1 ⇒ 0 に変
更しただけ
$S1 = "「第一選択の」「ドパミン」「と」「ノルエピネフリン」は,いずれも有効性が評価
されており,「ショックの治療」における「第一選択の」「ノルエピネフリン」「と」「ドパ
ミン」はどちらも「昇圧薬」として「推奨」されることとした.";
$S2 = "(「.+?」)+として";
##prev = 0;
while (1) {
##d = dllfunc( "FindGeneral", 0, 1, 0, $S2, $S1, 172);
question "例 3 (正常) 「はい」/「いいえ」どちらでもbreak" + "\n##d = " + str
(##d) + "\n$S2= " + $S2 + "\n$S1 = " + $S1; if (!result) break;
if (##d < 0) break;
}
endmacro;
|
|