正規表現あいまい検索結果のゆらぎNo.07099
rosegardenyk さん 12/07/09 13:23
 
rosegardenykです。またマクロ初心者の疑問です。

下記の//正規表現あいまい検索TEST用マクロを実行すると大部分(#i:1〜12)はうま
くのに、結果がおかしいケース (#i:13〜15) が見つかりました。何か設定ミスかプ
ログラミングミスでしょうか?

結果サマリ(v.8.20 β25)
以下のいずれの設定でも#i:1〜12は問題なし(#9は原文の数字区切りの有無による違
いだが問題なし)
#i:1〜12はすべて和文英文にある数字を見て後ろに続く英文にある同一数字を検索す
る場合です。
#i:13〜15、英文にある数字を見て後ろに続く和文にある同一数字を検索すると問題
発生。

設定1
あいまい検索設定 (X;チェックマーク ON)
X ヒープ領域使う
無視する文字「,」(半角カンマのみ)
#i: 15 で検索結果がおかしい

設定2
あいまい検索設定 (X;チェックマーク ON)
X 空白/タブを無視する  
X ヒープ領域使う
無視する文字「,」(半角カンマのみ)
#i: 13 〜15 で検索結果がおかしい

設定3
あいまい検索設定 (X;チェックマーク ON)
X 半角全角を区別しない 
X ヒープ領域使う
無視する文字「,」(半角カンマのみ)
#i: 15 で検索結果がおかしい

「半角全角を区別しない」のON/OFFは検索結果に影響しない模様です。

//正規表現あいまい検索TEST用マクロ
loaddll "hmjre.dll";
##n = dllfunc("SetUnicodeIndexAutoConvert", 1);//unicode文字による桁ずれを解消
$text = "∫可能性が高かった(ハザード比,それぞれ 1.90 [95% CI 1.12〜3.21]
と 2.02 [95% CI 1.13〜3.58])\n∬more likely to rupture (hazard ratio, 1.90
[95% CI, 1.12 to 3.21] and 2.02 [95% CI, 1.13 to 3.58], respectively). \n∫
ブレブもまた,可能性が高かった(ハザード比 1,234.63;95% CI 1.08〜2.48).\n
∬also more likely to rupture hazard ratio, 1234.63; 95% CI, 1.08 to 2.48 \n
\n∫結 論:この研究.\n∬ Conclusions:aneurysm. \n∬(Funded by the Ministry
of Health, Labor, and Welfare in Japan and others; 333 UCAS Japan UMIN-CTR P
ass number, C000000 418 \n∫(厚生労働省ほかから研究助成を 333 件受けた.\n
∫悉皆調査番号:C000000 418 \n";
$$f[1] = "1.90"; $$f[2] = "95"; $$f[3] = "1.12"; $$f[4] = "3.21"; $$f[5] = "
2.02";
$$f[6] = "1.13"; $$f[7] = "3.58"; $$f[8] = "1.90"; $$f[9] = "1,234.63"; $$f
[10] = "95";
$$f[11] = "1.08"; $$f[12] = "2.48"; $$f[13] = "333"; $$f[14] = "000000"; $$f
[15] = "418";
#i = 0;
while (#i <15) {
#i = #i + 1;
##f = dllfunc("FindRegular", $$f[#i], $text,0);
$$fig = midstr($text, ##f,dllfunc("GetLastMatchLength"));
##g = dllfunc("FindGeneral",0,1,1,"(?<="+$$fig + ".*?\n([∫∬].+?\n)*[∫∬]
(|.*?))" + $$fig ,$text, ##f);
##h = dllfunc("FindRegular", "([0-9][0-9,.]*|[A-Za-z]{3,9})", $text, ##g);//
数字を確定させる
$$h = midstr($text, ##h,dllfunc("GetLastMatchLength"));

if ($$fig != $$h) $wa = "検索結果が違います。#i = " + str(#i) + "\n" + $$fig
 + "  vs.  " + $$h; else $wa = "";
question "##f = " + str(##f) + "\n$$f[" + str(#i) + "] = " + $$f[#i]  + "\n$
$fig = " + $$fig + "\n\n##g = " + str(##g) + "\n##h = " + str(##h) + "\n$$h
= " + $$h + "\n\n" + $wa;if (!result) endmacro;
}//while
endmacro;


[ ]
RE:07099 正規表現あいまい検索結果のゆらNo.07100
秀まるお2 さん 12/07/09 17:04
 
 テストしてみたんですが、たしかにFindGeneralでのあいまい検索をONにすること
によって結果がおかしくなってるような気がします。

 HmJre.dllのバグの可能性が高いような気がします。

 もうちょっと詳しく調べてみます。

 その前に、とりあえず1点、HmJre.dllにとってサポート対象外の正規表現がある
ので、それだけ改良をお願いします。

 実は、HmJre.dllの正規表現では、前方一致/前方不一致指定の中に改行文字を入れ
ることが許されて無くて、それで検索するとうまくヒットしないです。

 具体的には、

 (?<=    ...    \n    ...   )xxx

 みたいな指定が出来ないです。

 これを回避するためには、かなり面倒なんですが、以下のように、

   (   ...   \n   ... )(xxx)(?\2)(?#fulllinematch)

 のようにしていただく必要があります。

 今回のマクロの例だと、

##g = dllfunc("FindGeneral",0,1,1,"(?<="+$$fig + ".*?\n([∫∬].+?\n)*[∫∬]
(|.*?))" + $$fig ,$text, ##f);

 の部分を、

$$find = "(" + $$fig + ".*?\\n([∫∬].+?\\n)*[∫∬](|.*?))(" + $$fig + ")(?\
\2)(?#fulllinematch)";
##g = dllfunc("FindGeneral",0,1,1,$$find ,$text, ##f);

 のようにしてもらわないと都合が悪いです。

 そのように直すと、#i == 13〜14まではうまくいくようです。でも#i = 15の時は
相変わらずダメみたいです。その原因は、HmJre.dllの中身をトレースして調べてみ
ます。少々お待ちください。

[ ]
RE:07100 正規表現あいまい検索結果のゆらNo.07101
秀まるお2 さん 12/07/09 17:09
 
>  実は、HmJre.dllの正規表現では、前方一致/前方不一致指定の中に改行文字を入れ
> ることが許されて無くて、それで検索するとうまくヒットしないです。

 これは、ヘルプ見ても書いてありませんでした。実際に検索してエラーが出て
みないと分からないようでした。大変失礼しました。

 ヘルプの方も修正させていただきます。

[ ]
RE:07101 正規表現あいまい検索結果のゆらNo.07102
秀まるお2 さん 12/07/09 17:20
 
 トレースしてみたら、たしかに座標の変換関係がおかしかったです。

 ユニコード文字の変換とあいまい検索での座標変換と両方実行しようとすると
おかしくなってるようでした。

 いろんなオプションがあると、それの種類の指数関数的に処理パターンも増え
るので、ちゃんといろんなパターンでテストしておかないとダメだったようです。
大変失礼しました。

 とにかくまた修正させていただきます。次のβ版にまたバグ修正したHmJre.
dllを添付させていただきます。

[ ]
RE:07102 正規表現あいまい検索結果のゆらNo.07103
秀まるお2 さん 12/07/09 17:45
 
 それと、追加になりますが、バグを直したら、

   (?<=  ... \n   .... ) xxx

 の方(元の方)の正規表現パターンでもうまくヒットするようになりました。

 (?<=...)の中で改行文字が使えないのは秀丸エディタで検索する時の制限にな
りまして、FindRegular等の中ではうまく動くようでした。

 これまたよく調べずに書いてすみません。

[ ]
RE:07103 正規表現あいまい検索結果のゆらNo.07104
rosegardenyk さん 12/07/12 02:48
 
> それと、追加になりますが、バグを直したら、 (?<=  ... \n   .... ) xxx の方
>(元の方)の正規表現パターンでもうまくヒットするようになりました。

V8.20 β27を待っていたら、β28までなっているのでびっくりしました。

問題点解消していました。 迅速な対応ありがとうございました。

[ ]