HmJreの正規表現についてNo.35105
あべのり さん 16/07/01 06:17
 
あべのりです.

次のマクロを動かしました.

loaddll hidemarudir + "\\HMJRE.DLL";
$$str = "goto GOTO;";
$$reg = "(?<=goto *)[^ ]*";
##pos = dllfunc("FindRegular",$$reg,$$str,0);
##len = dllfunc("GetLastMatchLength");
message "pos = " + str(##pos) + ", len = " + str(##len);

結果としては
pos = 5, len = 4
を期待していたのですが,
pos = 4, len = 0
となってしまいました.前方一致の部分がものぐさ的な挙動になっているような気が
します.意図されている挙動でしょうか?

よろしくお願いします.

[ ]
RE:35105 HmJreの正規表現についてNo.35106
秀まるお2 さん 16/07/01 09:21
 
 ソースコードのトレースまではしてないのですが、ロジック的に考えたらそれ
で仕様になると思います。

 正規表現の処理の「 *」や「[^ ]*」は長い文字列にヒットする方が優先です
が、前方一致/前方不一致の場合はそれ自体はヒットする文字列の一部では無い
ので、長い方優先というよりは、とりあえず「ヒットするかどうか」の判定しか
しないです。

 それで、HmJre.dllの処理して、x座標=0から順番に前方一致のパターンが
ヒットするかどうか順に判定していくんですが、

goto GOTO

 の文字列の「goto」の直後(x=4)の位置を末端位置として、

    goto *

 がヒットするかどうか判定し、それで「ヒット」という扱いになります。
 (x=0、xEnd=4でヒットする)

 その位置から

    [^ ]*

 のマッチングをすると、ぞれが長さ0にヒットするってことになって、結果そ
こが返ることになるようです。

 前方一致も含めた全体が最長にヒットして欲しい場合は、

   (goto *)([^ ]*)(?\2)

 のように記述する方法があります。こっちをお勧めしたいです。

 (?\番号)を使えば普通の正規表現とまったく同じロジックになるし、処理速度
的にもこっちが速いことが多いです。こっちお勧めします。


 それか、

    (?<=goto +)[^ ]*

 か、または

    (?<=goto +)[^ ]+

 でも期待通りにはなるようです。

 改行にヒットしないために、

    (?<=goto +)[^ \n]+

 とした方がいいですけども。

[ ]
RE:35106 HmJreの正規表現についてNo.35107
あべのり さん 16/07/01 16:11
 
> ソースコードのトレースまではしてないのですが、ロジック的に考えたらそれ
>で仕様になると思います。

詳しい説明ありがとうございます,理解しました.

[ ]