hmjre.dllの仕様の確認と不具合No.06060
colder さん 10/09/09 14:48
 
colderです

hmjre.dllの仕様の確認と不具合の報告です。

・ReplaceRegularの置換文字列にエスケープシーケンスが
使えないのは仕様でしょうか?
//再現用マクロ
loaddll "hmjre.dll";
$ret = dllfuncstr("ReplaceRegular","\\t","a\tc",0,"\\x20",1);
insert $ret;
freedll;


・ReplaceRegularで単語非境界 \Y が全角文字の
1バイト目と2バイト目の間にマッチする場合がある。
//再現用マクロ
loaddll "hmjre.dll";
$ret = dllfuncstr("ReplaceRegular","\\Y","りんご",0," ",1);
insert $ret;
freedll;


・検索パターン「(.{3,}).*\1e」が「xabcdfabcde」にマッチしない
//再現用マクロ
insert "\nxabcdfabcde\n";
gofiletop;
searchdown "(.{3,}).*\\1e",regular;
if(!result) message "見つかりませんでした";


・置換で後方参照にヒットしていない部分が格納されていることがある
  例1:検索パターン「(\d)?\d」置換パターン「<\1>」で文字列「2」を置換すると
「<2>」になる
  例2:検索パターン「\i|(\d)」置換パターン「<\1>」で文字列「a」を置換すると
「<a>」になる


・検索パターン「\i|(\d)\1」が不正なものとなる


・あいまい検索で「あ」と「ぁ」を区別しないで「わ」と「ゎ」、「ワ」と「ヮ」を
同一視しない


・あいまい検索/正規表現ともにonで、同一視指定ファイルに以下のものを設定すると、
  前方一致/不一致、後方一致/不一致、タグ参照しない括弧が不正なものになる。

//同一視する設定
<= less_equal
<! less_not
= assign
! not
: colon

環境 XP + 秀丸ver8.02β7 + hmjre.dllver3.29

[ ]
RE:06060 hmjre.dllの仕様の確認と不具合No.06061
秀まるお さん 10/09/09 18:25
 
 毎度バグ情報というか、大変詳しくテストしていただいてありがとうございま
す。

> ・ReplaceRegularの置換文字列にエスケープシーケンスが
> 使えないのは仕様でしょうか?

 「\0〜\9」は使えるようですが、その他は、例えば「\\」が使える以外は全然
ダメになってしまってました。

 マクロの中だと"\t"とか書いた物がそのままマクロの処理としてタブ文字に置
換される等となっていたのであまり必要性が無かった(あるいはユーザーさんが
気づかなかった)ようです。ちゃんとエスケープシーケンスを解釈するように修
正させていただきます。

> ・ReplaceRegularで単語非境界 \Y が全角文字の
> 1バイト目と2バイト目の間にマッチする場合がある。

 調べてみたら、ReplaceRegularで全置換指定された場合で、ヒットした長さが
0の場合の処理で、全角文字をちゃんと2バイトスキップさせる処理がなされて
なくて、結果として全角文字の間にヒットしてしまってるようでした。

 ということでこれまた修正させていただきます。

> ・検索パターン「(.{3,}).*\1e」が「xabcdfabcde」にマッチしない

 これまた調べてみたら、タグ付き正規表現の場合に一部の高速化処理をキャン
セルするのが不完全で、それでうまくヒットしてませんでした。

 これまた修正させていただきます。

>   例1:検索パターン「(\d)?\d」置換パターン「<\1>」で文字列「2」を置換すると
> 「<2>」になる

 調べてみたら、「?」の処理の中でのタグのヒットする位置についての処理が
バグってました。

 (\d)*\d とかの「*」のパターンの方はうまく動くようになってましたが、
「?」についてはバグってました。たぶんテスト不足だったのだと思います。

>   例2:検索パターン「\i|(\d)」置換パターン「<\1>」で文字列「a」を置換すると
> 「<a>」になる

 これは、調べてみたら大変ややこしいことになっていたんですが、とにかくバ
グということで修正させていただきます。

 基本的に、現状、  abc|xyz  のようなパターンの中で括弧を使って、それを
タグ付き正規表現と扱うような処理がまったくうまく機能してませんでした。う
まくタグとして機能するように修正させていただきます。

    abc|(?:x(y)z)

 とかのパターンでもうまくいくようにします。

> ・あいまい検索で「あ」と「ぁ」を区別しないで「わ」と「ゎ」、「ワ」と「ヮ」を
> 同一視しない

 完全に抜けてました。追加させていただきます。

> ・あいまい検索/正規表現ともにonで、同一視指定ファイルに以下のものを設定する
> と、
>   前方一致/不一致、後方一致/不一致、タグ参照しない括弧が不正なものになる。

 調べてみたら、同一視指定文字列の変換の中で、(?で始まる正規表現パターン
についての配慮が抜けてしまっていて、結果として(?<=...)とかの中の「<=」な
んかが同一視指定の変換がされて、それでおかしくなってしまってました。

 ということでこれまた修正させていただきます。

 ということで、なんとか今日中に一通り修正出来ましたが、修正箇所が多いの
で、しばらくこちらでいろんなパターンを作ってテストしたいと思います。

[ ]
RE:06061 hmjre.dllの仕様の確認と不具合No.06064
秀まるお さん 10/09/10 16:08
 
 先ほど、秀丸メールのV5.50β17をアップロードしたんですが、それに今回の
バグ修正をしたHmJre.dllを添付させていただきました。

 よかったらそこからHmJre.dllだけ取り出して秀丸エディタの方でも使って欲
しいです。

 秀丸エディタの方でも、次のβ版にはV3.30のHmJre.dllが添付出来ると思いま
す。

[ ]
RE:06064 hmjre.dllの仕様の確認と不具合No.06065
colder さん 10/09/10 20:01
 
hmjre.dll v3.30を取り出して、ひととおり試したところ、報告したすべての不具合
が解消されているのを確認しました。

ありがとうございました。

[ ]
RE:06064 hmjre.dllの仕様の確認と不具合No.06066
colder さん 10/09/10 23:49
 
colderです。
正しく動作していると思ったのですが、
また、正しく動作しない例を見つけてしまいました。

正規表現「(\d)?\1」 が「1x2」の2にマッチする
正規表現「(\d)??\1」 が「1x2」のxの直後の0文字にマッチする
正規表現「(\d)*\1」、「(\d)+\1」、「(\d)*?\1」、 「(\d)+?\1」が「11」にマッ
チしない

[ ]
RE:06066 hmjre.dllの仕様の確認と不具合No.06067
秀まるお さん 10/09/11 12:21
 
 毎度バグ情報どうもです。

 タグ付き正規表現は奥が深いというか、いろいろ教えていただいたパターンを
考えると、内部的にやってるいろんな高速化の処理を多少犠牲にして安全に処理
させるしかなさそうです。

 (他にも探せばいろいろダメなパターンが出てきそうな気もするし…)

 ということで、その辺また修正させていただきます。

[ ]
RE:06066 hmjre.dllの仕様の確認と不具合No.06068
colder さん 10/09/11 13:05
 
自己レスですが

そもそもこれらの正規表現はどのように動作するべきなんでしょうかね。

「(\d)?\1」をいくつかのスクリプト言語/エディタで試したところ、
同じ数字が連続しているところにマッチするもの(Perl/Rubyなど)と
すべての場所で0文字にマッチするもの(JavaScriptなど)
の2種類がありました。

[ ]
RE:06068 hmjre.dllの仕様の確認と不具合No.06069
秀まるお さん 10/09/11 13:59
 
> 「(\d)?\1」をいくつかのスクリプト言語/エディタで試したところ、
> 同じ数字が連続しているところにマッチするもの(Perl/Rubyなど)と
> すべての場所で0文字にマッチするもの(JavaScriptなど)
> の2種類がありました。

 同じ数字の連続にマッチするのが正しいと思います。

 「(\d)?」が長さ0にマッチするケースで、その場合の「\1」の扱いが、たぶん
Perl/Rubyでは「\1は存在しない」という扱いになっていて、JavaScriptでは
「長さ0の文字列」という扱いになってるんじゃないかと思います。

 秀丸メールでは、「\1は存在しない」という扱いにしています。


[ ]
RE:06067 hmjre.dllの仕様の確認と不具合No.06070
秀まるお さん 10/09/13 18:07
 
 先ほど秀丸メールのV5.50β18をアップロードしまして、それにHmJre.dllの
V3.31を添付しています。

 一応、連絡いただいたパターンについては直っていることを確認しています。
さらには検索文字列の中にタグを指定したケースについて、多少速度を犠牲にし
てでも確実性をアップさせるような判定を入れました。

 ということではありますか、今ちょっと、もっと意地悪なパターンでもテスト
してみようと思ったら、うまくいかないパターンがまだありました。


    (?:abc(.*)xyz)*\1

 で検索して、例えば

abc!!!xyzabc///xyz!!!

 に検索させると、後半の「abc///xyz」の部分にヒットしてしまってるようで
す。ちなみに鬼車ではうまく動作するようです。

 ということでまた調べます。

[ ]
RE:06070 hmjre.dllの仕様の確認と不具合No.06071
colder さん 10/09/13 18:25
 
colderです。

うまくいかない例を単純化できました。
「(1)*\1」で「1」にマッチします。


[ ]
RE:06071 hmjre.dllの仕様の確認と不具合No.06072
秀まるお さん 10/09/13 20:43
 
 再現パターンを単純化していただきありがとうございます。

 たしかに、(....)* のような繰り返しパターンが、一度1回以上ヒットしてか
ら0回ヒットになって、その後「\1」のようなタグにヒットさせる動作があった
時にダメってバグでした。

 ということでこれまた修正させていただきます。

[ ]