ホームページ  >  記事  >  バックエンド開発  >  php - PCRE 正規表現注釈と再帰モード

php - PCRE 正規表現注釈と再帰モード

伊谢尔伦
伊谢尔伦オリジナル
2016-11-21 17:10:401239ブラウズ

コメント

文字シーケンス (?# マークは、閉じ括弧が見つかるまでコメントを開始します。ネストされた括弧は許可されません。コメント内の文字はパターンの一部として照合されません。

PCRE_EXTENDED オプションが設定されている場合、文字 クラスの外側にあるエスケープされていない # 文字は、行の残りの部分がコメントであることを意味します。

再帰モード

括弧の無限の入れ子を許可する問題を考慮してください。 最良の方法は、再帰を使用しないことです。 Perl 5.6 では、正規表現の再帰 (?R) を使用してこの再帰の特殊な使用を可能にする実験的な機能が提供されています (PCRE_EXTENDED オプションが設定されていると仮定すると、空白文字は使用されません)。は無視されます): ( (?>[^()]+) | (?R) )* )。次に、任意の数の括弧以外の文字シーケンスと一致します。パターン自体 (例: 正しい括弧部分文字列)、そして最後に閉じ括弧

このパターンの例には、入れ子が無限に繰り返されているため、括弧以外の文字に対して 1 回限りのサブグループ一致を使用しています。たとえば、パターンがパターンに一致しない文字列に適用されると、(aaaaaaaaaaaaaaaaaaaaaaaaaaaa() に適用されるとすぐに「一致なし」という結果が生成されます。ただし、ワンショット サブグループを使用しないと、この一致は発生します。 + および * の反復修飾子でターゲット文字列を区切る方法は多数あり、失敗が報告される前にすべてのパスをテストする必要があるため、時間がかかります

最終的に設定されるすべてのキャプチャされた値は次のとおりです。再帰的な最も外側のサブパターンから取得された値。上記のパターンが (ab(cd)ef) に一致する場合、取得されたサブグループは最終的に最上位の値である値「ef」に設定されます。追加の括弧が追加された場合 ( ( ( (?>[^()]+) | (?R) )* ) )、キャプチャされた文字列は、上部括弧「ab(cd)ef 」の一致する内容になります。パターン内に 15 個を超えるキャプチャ括弧がある場合、PCRE は再帰中にデータを保存するために pcre_malloc を使用して追加のメモリを割り当て、メモリを割り当てられない場合は最初の 15 個の括弧のみを保存します。再帰内でメモリ不足エラーを与えることはできません

PHP 4.3.3 以降では、(?1)、(?2) などを再帰サブグループに使用できます: ( ?P>name) または (?P&name) ).

再帰サブグループ構文が参照するサブグループ括弧の外側で使用される場合 (サブグループ番号であってもサブグループ名であっても)、この操作はプログラミング言語のサブルーチンと同等です。 前の例の 1 つは、パターン (sens|respons)e と 1ibility が「センスと責任」および「応答と責任」には一致しますが、「センスと責任」には一致しないと述べています。代わりにパターン (sens|respons)e と (?1)ibility が使用された場合、これら 2 つの文字列と同様に「sense andresponsibility」と一致します。 この参照メソッドの意味は、参照のサブパターンを即座に照合することです。 (注釈: 逆方向参照は、参照されたサブグループの以前に一致した結果とのみ一致します。ここでの再帰的構文参照は、参照されたサブパターンを再一致させることです。)

ターゲット文字列の最大長は、int に格納できる最大の正の整数です。 -type 変数。ただし、PCRE は再帰を使用してサブグループと無限の繰り返しを処理します。 これは、一部のモードでは、使用可能なスタック領域がターゲット文字列によって制限される可能性があることを意味します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。