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
> ソースコードのトレースまではしてないのですが、ロジック的に考えたらそれ
>で仕様になると思います。
詳しい説明ありがとうございます,理解しました.
[
△
]