このサイトの詳細 |
はじめに |
正規表現クイックスタート |
正規表現チュートリアル |
置換文字列チュートリアル |
アプリケーションと言語 |
正規表現の例 |
正規表現リファレンス |
置換文字列リファレンス |
書籍レビュー |
印刷可能なPDF |
このサイトについて |
RSSフィードとブログ |
次のような正規表現(?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は、終わりのない再帰を検出しません。彼らは単にマッチングプロセスを実行し、一致を見つけません。
| クイック スタート | チュートリアル | ツール & 言語 | 例 | リファレンス | 書籍 レビュー |
| はじめに | 目次 | 特殊文字 | 非印刷文字 | 正規表現エンジンの内部 | 文字クラス | 文字クラスの減算 | 文字クラスの積 | 短縮文字クラス | ドット | アンカー | 単語境界 | 選択 | オプション項目 | 繰り返し | グループ化とキャプチャ | 後方参照 | 後方参照、パート2 | 名前付きグループ | 相対後方参照 | ブランチリセットグループ | 自由な空白とコメント | Unicode | モード修飾子 | アトミックグループ化 | 強欲な量指定子 | 先読みと後読み | 先読み、パート2 | マッチからテキストを除外 | 条件 | バランシンググループ | 再帰 | サブルーチン | 無限再帰 | 再帰と量指定子 | 再帰とキャプチャ | 再帰と後方参照 | 再帰とバックトラック | POSIXブラケット式 | ゼロ長の照合 | 継続的なマッチング |
ページURL: https://regular-expressions.dokyumento.jp/recurseinfinite.html
ページの最終更新日: 2020年3月30日
サイトの最終更新日: 2024年3月15日
Copyright © 2003-2024 Jan Goyvaerts. All rights reserved.