前方一致検索が最短にNo.08120
K'zawa さん 13/12/10 12:43
 
こんにちは、K'zawaです。

いつからか分からないのですが、前方一致の中の「.+」や「.*」などが
最短にマッチするようになっています。

(?<=hoge.+)

意図的な変更ではないですよね?

秀丸エディタ Version 8.33 Beta 14
HMJRE.DLL Version 4.04

[ ]
RE:08120 前方一致検索が最短にNo.08121
秀まるお さん 13/12/10 13:25
 
 これは、一応、今の仕様の方が正しいってことになると思います。

 1つの例としてですが、

    (?<=hoge.+)で、

    hogehogex

 のような文字列にマッチングさせた場合、今のバージョンだと、「hogeh」次
の位置と「hogehogex」の次の位置(=行末)の2カ所にヒットします。

 以前のバージョンだと行末の所にしかヒットしません。

 どっちが正しいかというと、やはり今の方で合ってるように思います。(意味
的には)

 何か意味的に、マッチすべきなのにマッチしない、あるいはマッチしてはいけ
ない所にマッチする例があれば教えて欲しいです。

[ ]
RE:08121 前方一致検索が最短にNo.08122
K'zawa さん 13/12/10 21:31
 
秀まるおさん、こんにちは。
K'zawaです。

> これは、一応、今の仕様の方が正しいってことになると思います。

ということは、

replaceallfast "(?<=hoge.+)", "fuga", regular;

replaceallfast "(hoge.+)", "\\1fuga", regular;

の2つは結果が違ってよいのですね。

> 何か意味的に、マッチすべきなのにマッチしない、あるいはマッチしてはいけ
>ない所にマッチする例があれば教えて欲しいです。

(?<=hoge.+)

は、後ろに$をつければ確実に最長になりますが、

(?<=^.+hoge)

のような場合は最短にしかマッチしないのでしょうか?

[ ]
RE:08122 前方一致検索が最短にNo.08124
秀まるお さん 13/12/11 08:38
 
> (?<=^.+hoge)
>
> のような場合は最短にしかマッチしないのでしょうか?

 この例だと、例えば

xhoge
xhogehoge

 のそれぞれの行末にヒットしないといけないはずなんですが、後者がヒットし
ないようです。

 原因を調べてみます。

[ ]
RE:08124 前方一致検索が最短にNo.08126
秀まるお さん 13/12/11 09:17
 
 調べてみたら、HmJre.dllの不具合のようでした。

 ロジック的なミスになります。前方一致指定の部分が検索開始位置よりも前に
一度ヒットしてしまうと、それ以降の検索がうまくいかないようです。

 なんとか直してまた次の秀丸エディタ/秀丸メールβ版に添付させていただき
ます。

[ ]
RE:08126 前方一致検索が最短にNo.08127
秀まるお さん 13/12/11 10:03
 
 ついでに…

>     (?<=hoge.+)で、
>
>     hogehogex
>
>  のような文字列にマッチングさせた場合、今のバージョンだと、「hogeh」次
> の位置と「hogehogex」の次の位置(=行末)の2カ所にヒットします。

 バグ修正したらヒットするパターンが変化してしまいました。

 hogeh
 hogeho
 hogehog
 hogehoge
 hogehogex

 の、合計5カ所にヒットするようになりました。これが正しい動作のようです。

[ ]
RE:08124 前方一致検索が最短にNo.08128
K'zawa さん 13/12/11 20:01
 
秀まるおさん、こんにちは。
K'zawaです。

>> (?<=^.+hoge)
>>
>> のような場合は最短にしかマッチしないのでしょうか?
>
> この例だと、例えば
>
>xhoge
>xhogehoge
>
> のそれぞれの行末にヒットしないといけないはずなんですが、後者がヒットし
>ないようです。

そういう仕様だということで、よくよく考えてみたら、

(?<=^.+hoge)

は、

(?<=.hoge)

と書けばよいことで、実用性そのものが無くなっているのですね。
なお、現仕様で、

xhogexhogex

のような行の、最も右にあるhogeの後ろにマッチさせるには、

(?<=hoge)(?=((?!hoge).)*$)

とでも書くしかないんでしょうか?
検索ダイアログで、その場で考えて手打ちするには、ちと辛いですが(^^;

tui
追伸
ヘルプの前方一致のところも変更が必要ですね。

[ ]
RE:08128 前方一致検索が最短にNo.08130
秀まるお さん 13/12/11 23:36
 
> xhogexhogex
>
> のような行の、最も右にあるhogeの後ろにマッチさせるには、
> (?<=hoge)(?=((?!hoge).)*$)
>
> とでも書くしかないんでしょうか?

 1行の中に「hoge」が複数あるとして、その一番最後の「hoge」の直後の長さ
0にヒットさせたいってことでしたら、

    (?<=hoge)(?!.*hoge)

 だけでいいような気がします。

 それか、

   hoge()(?!.*hoge)(?\1)

 って書く作戦もあります。「?\1」はHmJre.dll独自の書き方になりますけども。

> ヘルプの前方一致のところも変更が必要ですね。

 「検索系コマンドでの次候補/下候補系コマンド実行時の注意」って所になり
ますかね。たしかにこれは、以前は制限としてそうせざるを得なかったのですが、
最近のバージョンで制限を撤廃した所でした。ヘルプからは制限が撤廃されたこ
とをちゃんと書かないとダメでした。ご指摘ありがとうございます。

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

[ ]
RE:08128 前方一致検索が最短にNo.08131
アルビレオ さん 13/12/12 00:28
 
横から失礼します。ユーザーのアルビレオです。

基本的に前方一致や後方一致は「そのパターンが存在するかどうか」だけで条件
は十分に成立し、その上で「本体」のパターンが最初に見つかった最長の文字列
にマッチするというルールがあるため、前方一致や後方一致の部分が最長か最短
かというのは意味がないのではないでしょうか。

たとえば
 (?<=hoge.+)fuga
のようなパターンの場合、「少なくとも一個のhogeが前にある【最初に見つかっ
た】fugaにマッチする」という意味になるので、結果的に前方一致部分が最短に
なるのは仕様として正しいと思います。

[ ]
RE:08130 前方一致検索が最短にNo.08132
K'zawa さん 13/12/12 13:48
 
秀まるおさん、こんにちは。
K'zawaです。

> 1行の中に「hoge」が複数あるとして、その一番最後の「hoge」の直後の長さ
>0にヒットさせたいってことでしたら、
>
>    (?<=hoge)(?!.*hoge)
>
> だけでいいような気がします。

ああ、これだけでそこから行末までhogeがないって意味になるんですね!
ならば、最後のhogeの後ろから行末までは、

(?<=hoge)(?!.*hoge).*

で、全部のhogeの後ろのhogeじゃない部分が、

(?<=hoge)((?!hoge).)*

となるんですね。(半分独り言ですが)

>> ヘルプの前方一致のところも変更が必要ですね。
>
> 「検索系コマンドでの次候補/下候補系コマンド実行時の注意」って所になり
>ますかね。

そうです。前方不一致もそうですが。
ヘルプで気になったのが、前方一致と後方一致で、「普通の検索では必要ありま
せんが、」のひとことは必要でしょうか?
あと、変ったといえば、「高速化の処理を禁止」もありますね。

[ ]
RE:08131 前方一致検索が最短にNo.08133
K'zawa さん 13/12/12 13:52
 
アルビレオさん、こんにちは。
K'zawaです。

>基本的に前方一致や後方一致は「そのパターンが存在するかどうか」だけで条件
>は十分に成立し、その上で「本体」のパターンが最初に見つかった最長の文字列
>にマッチするというルールがあるため、前方一致や後方一致の部分が最長か最短
>かというのは意味がないのではないでしょうか。

これまでの話でなんとなく分かっていたのですが、その上で、このように説明し
ていただいて納得できました。
ありがとうございます。

[ ]
RE:08132 前方一致検索が最短にNo.08134
秀まるお さん 13/12/12 14:26
 
> ヘルプで気になったのが、前方一致と後方一致で、「普通の検索では必要ありま
> せんが、」のひとことは必要でしょうか?

 一応、昔は必要無いと思っていたのですが、最近は僕も使うことが多くなりま
した。余計だと思うので削除します。

> あと、変ったといえば、「高速化の処理を禁止」もありますね。

 safemode関係の記述については、一応V3.52〜V3.54での話も残しておいた方が、
いいかと思ったのですけど、せっかくなので削除してしまうことにします。

[ ]
RE:08134 前方一致検索が最短にNo.08135
K'zawa さん 13/12/12 15:00
 
秀まるおさん、こんにちは。
K'zawaです。

>> あと、変ったといえば、「高速化の処理を禁止」もありますね。
>
> safemode関係の記述については、一応V3.52〜V3.54での話も残しておいた方が、
>いいかと思ったのですけど、せっかくなので削除してしまうことにします。

廃止された旨追記が必要かなと思ったんですが、
どちらでもいいと思います。

[ ]
RE:08135 前方一致検索が最短にNo.08136
秀まるお さん 13/12/12 15:12
 
 HmJre.dllのヘルプの方では「廃止した」ってことは一応赤字で書いておいた
つもりですが、今確認したら、秀丸エディタのヘルプの方にまだ残ってしまって
ました。

 そっちの方は担当が違ってて気づきませんでした。

 そっちの方も削除させていただきます。

 なかなかあちこちあって難しいです。

[ ]