正規表現による置換で"*"演算子がものぐさNo.17077
山田太郎 さん 04/04/15 15:53
 
はじめまして。山田太郎と申します。
秀丸エディタ Ver4.07 & HmJre.dll Ver1.09 での現象です(OS: Windows Me)。

"*"演算子はこのままだと最長一致を目指すはずですが、
ある条件下(特定出来ていません)で"*?"のように振舞うようです。

例えば以下のような文字列

"松井秀喜 & 松井稼頭央"

に対して ".*松井" -> "Matsui" といった置換を行うことを考えると、期待される動
作は

".*松井" が "松井秀喜 & 松井" まで一気に消費して、置換後の文字列が "Matsui稼
頭央" となること

ですが(JRE32.DLL 及び HmJre.dll Ver1.00 だとちゃんとこのように振舞います)、
実際には、
まず行頭の "松井" にマッチ(そして置換)、次に "秀喜 & 松井" にマッチ(そし
て置換)、という具合に
都合2度マッチして、置換後の文字列が "MatsuiMatsui稼頭央" となってしまいます。

この“ものぐさ志向”は相当強いらしく、例えば上記の例において

".*松井\f[^&]*$" -> "Matsui\1"

と置換するようにすれば、(\1には"&"を含まない文字列しか格納されないので)
強制的に最長一致させられそうなものですが、この場合においてすら、置換後の文字
列は
"Matsui秀喜 & 松井稼頭央" というものになってしまいます(\1 == "秀喜 & 松井稼
頭央")。

つまり、通常は、
(ものぐさ指定したにしても)後に続く部分正規表現がマッチするように配慮しなが
らものぐさに振舞う
(後に続く正規表現がマッチしなくなるようであれば、しぶしぶ greedy に振舞う)
ものですが、
この例の場合だと、後に続く部分正規表現("[^&]*$")のことなどまるでお構いなし
に、
盲目的にものぐさに振舞っているようです。

しかも、そのことによってマッチしなくなってしまったはずの部分正規表現 "[^&]*$
" が、
"秀喜 & 松井稼頭央" にマッチしてしまう(延いては、全体としてマッチする)のが
分かりません。
結果的に全体としてマッチしなくなるというのならまだ分かるのですが(それでも充
分異常ですが)。

尚、HmJre.dll Ver1.00 だと、上記の ".*松井\f[^&]*$" -> "Matsui\1" という置換
では期待通りに
"Matsui稼頭央" となりますが、明示的にものぐさ指定して ".*?松井\f[^&]*$" -> "
Matsui\1" とすると
(これでも "Matsui稼頭央" にならなければならないはずなのですが)、
やはり "Matsui秀喜 & 松井稼頭央" となってしまい、これもおかしいです。

どこか考え違いがあればご指摘下さると幸いです。

[ ]
RE:17077 正規表現による置換で"*"演算子No.17080
秀まるお2 さん 04/04/15 18:29
 
 ご指摘の通り、たしかに「.*」の処理が間違ってるようです。

 V1.03付近にて、「.*」について特別な高速化処理をしまして、それが原因で
レベルダウンしてるようです。

 とにかく早めに修正してバージョンアップさせていただきます。

[ ]
RE:17080 正規表現による置換で"*"演算子No.17090
秀まるお2 さん 04/04/16 13:06
 
 バグ修正したバージョンをアップロードしました。秀丸V4.10βおよび鶴亀
メールには、次のバージョンアップ時に収録される予定です。

 ということでお願いします。

  http://www.hidemaru.interlink.or.jp/software/bin/hmjre110.lzh

[ ]
RE:17080 正規表現による置換で"*"演算子No.17091
秀まるお2 さん 04/04/16 13:10
 
 すみません。一応直したんですけど、2バイト文字への対応が間違ってました。

 もう一回アップロードしなおします。

[ ]
RE:17091 正規表現による置換で"*"演算子No.17092
秀まるお2 さん 04/04/16 13:30
 
 今またアップロードしました。今日(4月16日)の午後1時20分以降にダ
ウンロードした物が正解です。

 なんだかんだで、行頭の".*"および"^.*"についての高速化はやめました。た
だ、".*"についての一般的な高速化は生きているので、それなりに速い動作はし
ます。

 いろいろお手数かけます。

[ ]