時間がかかりそうなバグ

正規表現パターン ‘A(?<foo>0g<foo>0|1g<foo>1|)z’ が ‘0110’ にマッチしないのを発見しました。

再帰を使ったパターンを使う人が少ないようで今まで指摘がありませんでした。

もっともこのパターン、最後の z を削除するとマッチします。

この現象のおかげで私の再帰パターンの扱い方が間違っている(と言うか、Perl や鬼車とは違う)ことに気づきました。

再帰の場合、もっとも長くマッチした文字列を返すのが正しい(と言うか、Perl や鬼車と同じ)やり方のようです。

私のは、もっとも長くマッチした文字列を捨てて再帰を続けてしまったため、マッチしないこのようなケースが起こってしまったようです。

もっとも長くマッチした文字列を保存する仕組みはあります。

TREGroup のマッチデータはリストになっています。

これはドットNETの Capture を真似したのではなく、もともとは再帰でマッチしたグループの保存用に用意していたものです。

この仕組みはそのまま使えます。

それでも、もっとも長くマッチした文字列を、どのタイミングで、どのようない保存し、どのタイミングで取り出せばいいかで悩んでいます。

かつ、できるだけ書き換えずにすむ方法で・・・書き換えが多いとバグが増えますからね。

そんなわけで、このバグの修正にはしばらく時間を頂きます。

コメントを残す

メールアドレスが公開されることはありません。