ホームページ >バックエンド開発 >PHPチュートリアル >PCRE は、{a^n b^n c^n} のような文脈依存の文法に一致しますか?
文脈依存文法と PCRE のマッチング: {a^n b^n c^n}
正規表現は歴史的に正規表現と関連付けられてきました。文法、PCRE などの最新の実装は、この理論的枠組みを超えた高度な機能を示します。そのような能力の 1 つは、文脈依存文法の表現です。
この点で、PCRE は、正規表現では記述できない文法である {a^n b^n c^n} を解析できるでしょうか?という疑問が生じます。何人かのユーザーが示したように、答えは驚くべき「はい」です。
ユーザーが提示した特に説得力のある解決策の 1 つは、肯定的な先読みアサーションの使用です。
~^ (?=(a(?-1)?b)c) a+(b(?-1)?c) $~x
説明:
先読みアサーションを使用しない場合、正規表現は任意の数の as と、それに続く同数の bs および cs をチェックします。ただし、これは、文法で要求されているように、as の数が bs の数と等しいことを保証するものではありません。
先読みアサーション、具体的には (?=(a(?-1)?b)c)、はこの問題に対処します。これは、as の後に bs が続くシーケンスと一致し、毎回 as の数が bs の数と一致することを確認します。 c を含めることで、一致によってすべての bs が確実に消費されます。
結論:
この例は、最新の正規表現実装の驚くべき能力を示しています。非文脈自由文法を解析する PCRE の能力は、その多用途性と複雑なパターンを表現する能力を際立たせます。これは、正規表現は正規言語のみをキャプチャできるという長年の信念に疑問を投げかけます。
以上がPCRE は、{a^n b^n c^n} のような文脈依存の文法に一致しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。