正規表現 \zの扱いNo.05218
h-tom さん 10/02/25 23:31
 

h-tom です。

\zの扱いについて、確認したいことがあります。

Jre32.dll(Hmjre.dllも?)において、"\z"は、エンドオブファイル(EOF)という
扱いになっています。

hmonig.dll(鬼車)の場合は、"\z"は入力文字列の終端を意味し、"\n\z"とすると、
秀丸エディタでは、行単位でDLLに検索文字列を渡すので、各行に必ずマッチします。
(hmonig.dllの、Jre2GetMatchInfo_HmJre は 各行で true を、返している。)
ところが、実際にマッチするのは、最終行のみです。

// テスト文書
123\n
123\n
123\n
123\n
123\n ← 先頭から、"\n\z"で検索しても、検索でマッチするのは、ここだけ。
[EOF]
//

これは、Jre32.dllで、"\z"は、エンドオブファイル(EOF)という事もあり、
秀丸エディタ側で、何か制限を加えているのでしょうか?

[ ]
RE:05218 正規表現 \zの扱いNo.05219
秀丸担当 さん 10/02/26 09:22
 

>これは、Jre32.dllで、"\z"は、エンドオブファイル(EOF)という事もあり、
>秀丸エディタ側で、何か制限を加えているのでしょうか?

hmonig.dllの新しいものをダウンロードさせていただいて試してみたところ、確
かにそうなっていることが確認できました。
DLLに渡す文字列は \n が一個含まれているため "123\n123\n" になり、マッチ
するのは2番目の\nの位置でした。
秀丸エディタは複数行渡した場合、一行目にマッチする部分以外は対象としない
ようになっていました。
ヘルプの「\nを使った複数行検索の際の制限について」の、
「(これは)\n(秀丸エディタです)(?\2)」がマッチしないことの説明がその理由
のようです。
「(?#fulllinematch)\n\z」とすれば一応マッチさせることができましたが、ヘ
ルプにも書いてあるように不都合が出てきてしまいます。
こういう仕様ということでお願いするしかないかもしれないです。

[ ]
RE:05219 正規表現 \zの扱いNo.05220
秀丸担当 さん 10/02/26 10:06
 

(?#maxlines:数字)という書き方もV8.00からありました。
これは、現状では\nが含まれている数よりmaxlinesの値が大きい場合にのみ適用
でした。
この仕様を、\nが含まれている数を無視して必ずmaxlinesで指定した行数となる
ようにするといいかもしれないです。
そうすると、(?#maxlines:0)\n\z とすることで秀丸エディタ独自の余計なこと
をせずにマッチさせることができました。
そのほうがmaxlinesの利用価値もありそうですし、そのように修正してみようと
思います。

[ ]
RE:05220 正規表現 \zの扱いNo.05221
h-tom さん 10/02/26 10:58
 

h-tom です。

>hmonig.dllの新しいものをダウンロードさせていただいて試してみたところ、確
>かにそうなっていることが確認できました。
>DLLに渡す文字列は \n が一個含まれているため "123\n123\n" になり、マッチ
>するのは2番目の\nの位置でした。
>秀丸エディタは複数行渡した場合、一行目にマッチする部分以外は対象としない
>ようになっていました。
すみません、ログで見るところを間違えてました。
(検索ではなく、強調表示を見てた。)
検索の場合は、"123\n123\n"が、来ていたので、制限にかかりますね。

>この仕様を、\nが含まれている数を無視して必ずmaxlinesで指定した行数となる
>ようにするといいかもしれないです。
>そうすると、(?#maxlines:0)\n\z とすることで秀丸エディタ独自の余計なこと
>をせずにマッチさせることができました。
>そのほうがmaxlinesの利用価値もありそうですし、そのように修正してみようと
>思います。
了解です。

dll側も、\z、\Zの扱いについての注意点を、なんか書いておきます。

[ ]