|
でるもんた・いいじまです。
> Web上には
> https://www.debuggex.com/
> 等の正規表現のデバッグや解析を行うサイトがありますが、
> どれもPerlなどのメジャーな処理系に限定しているため、
> HmJre.dll独自のパターンの解析にはほとんど役に立ちません。
> そこで、HmJre.dll専用の正規表現の解析手段があれば大変助かるのですが、
> 現在の秀丸エディタでマクロなどを駆使して手軽に解析することは可能でしょうか。
まず最初に裏技からお示ししておくと、HmJre.dllはただのDLLですから、他の言語か
らも呼び出せます。関数の仕様は秀丸のフォルダにあるHmJre.chmをごらんください。
ただし、32bit版秀丸エディタからの関数の呼び出し規約はcdecl、一方でWin32APIは
stdcall規約ですから、VBAなどの一般的な言語でWin32API呼び出し用に用意されてい
る方法は使えません。C/C++言語なら実装可能ですが、下準備が少々面倒臭そうです。
一方で、64bit版ならWin64API自体が秀丸からのDLL呼び出しと同じcdecl規約になり
ましたので、普通の言語から普通に呼び出せます。ExcelのVBAで次のように記述して、
ワークシートから参照するのが簡単だと思います。
'32bit版と混同しないようファイル名に"64"をつけて、自前のフォルダにコピーして
使用
Private Declare PtrSafe Function FindRegular Lib "hmjre64.dll" _
(ByVal regExp As String, ByVal targetString As String, _
ByVal startPos As LongLong) As LongLong
Public Function RegExMatch(target As String, re As String) As LongLong
RegExMatch = FindRegular(re, target, 0)
End Function
A1 B1 C1
aaaa a+ =RegExMatch(A1,B1)
ちなみに、C1に =FindRegular(B1,A1,0) と書いたら、-2が返ってきました。もしか
して、こういうDLL呼び出しをするとbyvalなりLongLongなりの宣言が無視されるので
しょうか…。
VBAではなくC#から関数を呼ぶ場合は、
class HmJre {
[DllImport("hmjre64.dll", CharSet=CharSet.Ansi)]
extern static long FindRegular(string regExp, string target, long startPos);
...
};
のようにクラスを定義すればよさそうです。
☆ ☆ ☆
> また、強調表示など動作が重くなるのを防止するために、
> 前もって正規表現の実行速度を計測したいのですが、
> 適切な方法が分からずに困っています。
これもVBAやC#から呼び出すのがいいと思います。1回だけ計測してナノ秒単位の値を
得ても各種オーバーヘッドで山ほど誤差が出ますので、正規表現のコンパイルとマッ
チングを100万〜1億回くらい繰り返して、その途中で所定の時間(たとえば10秒)が
経過したらそこで打ち切り、とすると計測精度が上がります。
☆ ☆ ☆
> 1. マッチした対象文字列の一部分からそれに対応しているパターンの
> 一部分を抜き出す。例えば、正規表現が
> [a-z]+[0-9]+
> で検索対象が
> 123abc456def789ghi
> のとき、マッチした対象を
> abc456
> def789
> と列挙し、
ここまではHmJre.dllの GetLastMatch****() 関数で簡単に実装できます。
さらに正規表現のどの部分がマッチ文字列のどの部分と対応しているかを
> [a-z]+ => abc
> [0-9]+ => 456
> [a-z]+ => def
> [0-9]+ => 789
> という感じで列挙する。
これには「長い正規表現を部分部分に分解する作業」そのものが必要になります。す
なわち、自力でゼロから正規表現エンジンを作れる技能が必要になります。
なので、どうしてもデバッガなしではデバッグができないのであれば、「HmJre.dll
独自のパターン」を一切使わず、メジャーな処理系と共通の文法だけで正規表現を書
くしかないでしょう。
☆ ☆ ☆
というかそもそも、正規表現にしてもプログラミング全般にしても、普通ならまず小
さなもので動作確認をして、徐々に大きくしながら動作テストとデバッグログ出力を
繰り返していき、最終的にパッケージにするのがスジです。
パーツテストなしでいきなり巨大なものを一気に組み上げて、その状態からぶっつけ
本番でデバッガに投入、という手法は一般論として、個別のパーツ作りすらおぼつか
ないレベルの人が採用していい開発手順ではありません。
|
|