HMJRE.DLLでのものぐさ指定No.06128
きいろいまふらあ さん 05/01/10 02:29
 
β版の話でもなくて、秀丸本体の話でもなくて、HMJRE.DLLの話なんですけど、
ここで質問してよいでしょうか?

秀丸4.14+HMJRE.DLL1.12です。

行末指定の「$」を併用すると、ものぐさ指定が働かないような気がします。

<A><B><C>

という行に対して
「<.*?>」で検索すると、ものぐさ指定が働いて、<A>→<B>→<C>の順にマッチし
ていきます(期待通り)。

そこで<C>だけにマッチさせようと、末尾に「$」を付けて「<.*?>$」と指定した
のですが、<A><B><C>→<B><C>→<C>の順にマッチしていきます。ものぐさ指定し
なかったときと同じ挙動となっています。

ちなみに「^<.*?>」は<A>だけにマッチします(期待通り)。

この動作は仕様でしょうか?

[ ]
RE:06128 HMJRE.DLLでのものぐさ指定No.06129
山紫水明 さん 05/01/10 11:41
 
 きいろいまふらあさん,こんにちは。

 秀まるおさんのコメントの前に前座で,

>そこで<C>だけにマッチさせようと、末尾に「$」を付けて「<.*?>$」と指定した
>のですが、<A><B><C>→<B><C>→<C>の順にマッチしていきます。ものぐさ指定し
>なかったときと同じ挙動となっています。

 これは自然なようにも思えます。どこを起点に判断するかということでしょう
が,最初の「<」を起点にすれば,結局いちばん短くても行末まで取り込まれま
す。
 「$」を起点にして最短を取ればすれば確かに「<C>」にはなるのですが。
 どちらの仕様もあり得るように思えます。

 っというようなことは先刻ご承知の上で,仕様の確認をお求めになったとは思
いますが。

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:06129 HMJRE.DLLでのものぐさ指定No.06130
encodingshiftjis さん 05/01/10 16:52
 
直感に反する振る舞いかもしれません
最短という用語も厳密には? . は <>を含みますし

パターンを伸ばすとき、次も見ているかどうかです。
? の解釈は
?前のパターンと?後のパターン の【両方】にマッチする場合
?後の方に先にマッチしたとして進みます。
そうして進行して、ダメだった場合、巻き戻しが起きて
?前のところまで巻き戻り、?前のパターンを伸ばします。

?が無い場合は 次のパターンのマッチを見ず伸ばします。

[ ]
RE:06130 HMJRE.DLLでのものぐさ指定No.06131
秀まるお さん 05/01/10 21:50
 
 一応僕としては仕様のつもりです。

 正規表現のマッチングは先頭のパターンから順番に実行されます。

 まず、"<A>"の所の先頭の"<"に対して正規表現パターン先頭の"<"がヒットし
ます。なので、その続きとして、「.*?>」のマッチングが実行されます。

 そうすると、まず、".*?"が、ものぐさ指定の関係で最短の物からマッチング
テストされ、まずは、

 A

 にマッチします。しかし、その後の"$"がマッチしません。次に、

 A>

 にマッチしますが、同様のその後ろの$がマッチしません。

 っと順にやっていくと、最終的に".*?"がA><B><C>"にマッチした所で"$"もマ
ッチし、そこで終了します。

 ということで仕様ってことになります。

 BRefIf.dllでも同様でした。

[ ]
RE:06131 HMJRE.DLLでのものぐさ指定No.06132
きいろいまふらあ さん 05/01/11 00:48
 
> 一応僕としては仕様のつもりです。

了解です。しくみについてもよく理解しました。
直感的にも

<.*>→<.*>$→<.*?>$

という流れで考えればそれほど不自然でもないですね。

山紫水明さん、encodingshiftjisさんもありがとうございました。

[ ]