HmJre.dll 1.79でタグ付き正規表現に疑問No.11234
IKKI さん 06/10/23 02:32
 
IKKI です。こんばんは。

HmJre.dll のタグ付き正規表現の動作に疑問があります。

sample.html に対して 1.mac を実行すると結果1のようになります。

 // 1.mac
 replaceall "=(\"[^\"]*\"|[^'\"<> ]*)", "=[\\1]", regular;

 // sample.html
 <a href="hoge.html"><img src=fuga.jpg></a>

 // 期待する結果
 <a href=["hoge.html"]><img src=[fuga.jpg]></a>

 // 実際の結果1
 <a href=[]><img src=[fuga.jpg]></a>

2.mac を実行すると結果2のようになり、期待どおりです。

 // 2.mac
 replaceall "=(\"[^\"]*\"|[^'\"<> ]+)", "=[\\1]", regular;

 // 実際の結果2
 <a href=["hoge.html"]><img src=[fuga.jpg]></a>

1.mac と 2.mac の違いは "=(a|b*)" と "=(a|b+)" です。
前者の場合に \1 が a でなく b* の方になってしまうのではと想像します。
この動作は最長一致の原則からして怪しくないでしょうか?

あまり原因を絞り込めていなくて申し訳ありませんが
ご確認のほどよろしくお願いいたします。

(秀丸 v6.05 + HmJre v1.79 + Windows XP)

[ ]
RE:11234 HmJre.dll 1.79でタグ付き正規表No.11235
アルビレオ さん 06/10/23 03:20
 
ユーザーのアルビレオです。

> // 1.mac
> replaceall "=(\"[^\"]*\"|[^'\"<> ]*)", "=[\\1]", regular;
>
> // sample.html
> <a href="hoge.html"><img src=fuga.jpg></a>
>
> // 期待する結果
> <a href=["hoge.html"]><img src=[fuga.jpg]></a>
>
> // 実際の結果1
> <a href=[]><img src=[fuga.jpg]></a>
>
>2.mac を実行すると結果2のようになり、期待どおりです。
>
> // 2.mac
> replaceall "=(\"[^\"]*\"|[^'\"<> ]+)", "=[\\1]", regular;
>
> // 実際の結果2
> <a href=["hoge.html"]><img src=[fuga.jpg]></a>
>
>1.mac と 2.mac の違いは "=(a|b*)" と "=(a|b+)" です。
>前者の場合に \1 が a でなく b* の方になってしまうのではと想像します。
>この動作は最長一致の原則からして怪しくないでしょうか?

単に b* の方に一致しているなら <a href="[hoge.html]"> となるはずです。
<a href=[]> となるということは、「一致しているのは a で、\1 に格納される
のは b* になっている」ということだと思われます。

[ ]
RE:11234 HmJre.dll 1.79でタグ付き正規表No.11239
秀まるお さん 06/10/23 15:00
 
 たしかにバグのようです。

 "[^"]*"

 についてのマッチングを実行して正しいタグ位置を計算しつつも、次の

 [^'"<> ]+

 にマッチするかどうかのテストで案の定マッチして、それのせいでタグ位置が
上書き(この場合長さゼロにヒット)されてしまってました。

 とにかくバグということで修正させていただきます。

 バグ修正したHmJre.dllについては、秀丸エディタ/秀丸メールの次のバージ
ョンからの添付になると思いますが。

[ ]
RE:11239 HmJre.dll1.79でタグ付き正規表No.11243
IKKI さん 06/10/24 05:35
 
IKKI です。こんにちは。

>  たしかにバグのようです。
>
>  "[^"]*"
>
>  についてのマッチングを実行して正しいタグ位置を計算しつつも、次の
>
>  [^'"<> ]+
>
>  にマッチするかどうかのテストで案の定マッチして、それのせいでタグ位置が
> 上書き(この場合長さゼロにヒット)されてしまってました。

わかりました。修正のほどよろしくお願いいたします。

[ ]