再帰パターンの挙動

SkRegExp の再帰パターンは Perl 5.10 とは異なり、再帰グループ内にはバックトラックしません。

そうなると TRegEx (PCRE) と同じ挙動になるはずですがそうはなりません。

以前はヘルプに「再帰グループ内にはバックトラックしない」と書いていたんですが、そうした経緯もあって今は記述していません。要はその辺りを曖昧にしているわけです。

個人的には、必要性が思い浮かばないのと、幾何級数的マッチ対策ができないので、バックトラックしない方がいいと思っています。

私の実装がまずいのだろうといろいろいじってましたが、どうも SkRegExp の動作の方が正しいのでは?と思うようになりました。

と言うのも、SkRegExp でマッチして、PCRE でマッチしないパターンを、Perl 5.10 で動かすとマッチするのです。

SkRegExp で再帰パターンを処理しているのは TREMatchEngine.MatchRecursion メソッドですが、見てもらえばわかるとおり、再帰グループ内で使ったスタックは捨ててしまっていますので、再帰グループにはバックトラックできません。

ちなみに今のところ、PCRE でマッチして、SkRegExp でマッチしないパターンは見つかっていません。

と言うわけで、PCRE と挙動を合わせることはあきらめました。明日にでも、仕様を明記して、余分なコードを削除したバージョンを公開します。

コメントを残す

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