クイック スタート
チュートリアル
ツール & 言語
リファレンス
書籍 レビュー
正規表現チュートリアル
はじめに
目次
特殊文字
非印刷文字
正規表現エンジンの内部
文字クラス
文字クラスの減算
文字クラスの積
短縮文字クラス
ドット
アンカー
単語境界
選択
オプション項目
繰り返し
グループ化とキャプチャ
後方参照
後方参照、パート2
名前付きグループ
相対後方参照
ブランチリセットグループ
自由な空白とコメント
Unicode
モード修飾子
アトミックグループ化
強欲な量指定子
先読みと後読み
先読み、パート2
マッチからテキストを除外
条件
バランシンググループ
再帰
サブルーチン
無限再帰
再帰と量指定子
再帰とキャプチャ
再帰と後方参照
再帰とバックトラック
POSIXブラケット式
ゼロ長の照合
継続的なマッチング
このサイトの詳細
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—Better than a regular expression tutorial!

無限再帰

次のような正規表現(?R)?zまたはa?(?R)?zまたはa|(?R)z再帰の前にマッチさせなければならないものが何もない状態で再帰を使用すると、無限再帰が発生する可能性があります。正規表現エンジンがテキストを読み進めずに再帰に到達した場合、次の再帰もテキストを読み進めずに再帰に到達します。最初の正規表現では、マッチング試行の開始時にこれがすぐに発生します。他の2つでは、それ以上の文字がない場合にすぐに発生します。aマッチングされるはずです。

JGsoft V2とBoost 1.64は、最初の2つの正規表現が常に無限再帰につながるため、構文エラーとして扱います。3番目の正規表現は、マッチングできるため許可します。a。Ruby 1.9以降、すべてのバージョンのPCRE、およびPCRE2 10.20以前は、潜在的な無限再帰の3つの形式すべてを構文エラーとして扱います。Perl、PCRE2 10.21以降、およびBoost 1.63以前は、3つの形式すべてを許可します。

循環的な無限サブルーチン呼び出し

サブルーチン呼び出しも無限再帰につながる可能性があります。すべてのフレーバーは、潜在的に無限の再帰を処理します。((?1)?z)または(a?(?1)?z)または(a|(?1)z)正規表現全体の潜在的な無限再帰を処理するのと同じ方法で。

しかし、それ自体は再帰的ではないサブルーチン呼び出しは、呼び出すグループに、最初のサブルーチン呼び出しの親グループを呼び出す別のサブルーチン呼び出しがある場合、結果的に再帰的になる可能性があります。サブルーチン呼び出しが強制的に循環する場合、それも無限再帰につながります。正規表現をコンパイルするときにそのような循環呼び出しを検出することは、直接的な無限再帰をチェックするよりも複雑です。JGsoft V2とRuby 1.9以降のみがこれを検出し、構文エラーとして扱うことができます。他のすべてのフレーバーでは、これらの正規表現を許可します。

エラーとクラッシュ

無限再帰が発生した場合、それが直接再帰であろうと、循環するサブルーチン呼び出しであろうと、JGsoft V2、Perl、およびPCRE2は、マッチング試行全体を中止するマッチングエラーとして扱います。Boost 1.64は、再帰を試行せず、再帰が失敗したかのように動作することでこれを処理します。再帰がオプションである場合、Boost 1.64は他のフレーバーがエラーをスローする場所でマッチングを見つける場合があります。

Boost 1.63以前およびPCRE 8.12以前は、無限再帰が発生するとクラッシュします。これは、古いPCREバージョンに基づいているため、Delphi(バージョンXE6まで)およびPHP(バージョン5.4.8まで)にも影響します。

終わりのない再帰

次のような正規表現a(?R)z再帰トークンがオプションではなく、同じ再帰のない代替がない場合、終わりのない再帰につながります。そのような正規表現は決して一致を見つけることができません。いつa正規表現エンジンが再帰を試みます。別のaに一致できる場合は、再び再帰を試みる必要があります。最終的にaは、マッチさせる文字がなくなります。その後、再帰は失敗します。オプションではないため、正規表現はマッチに失敗します。

JGsoft V2とRubyは、正規表現をコンパイルするときにこの状況を検出します。彼らは終わりのない再帰を構文エラーとしてフラグを立てます。Perl、PCRE、PCRE2、およびBoostは、終わりのない再帰を検出しません。彼らは単にマッチングプロセスを実行し、一致を見つけません。