DFAとNFA

  

1940年代の神経生理学的研究で生まれた正規表現は、有名な数学者スティーブン・クリーネによって正式に記述されました。具体的には、Kleeneは、前述の神経生理学的研究を要約し、「Regular Set Algebra」と題された論文の中で「regular set」を定義し、それについて代数システムを定義し、そしてトークンシステムは、通常のセットを記述するために使用されます。これは、quoによって「正規表現」と呼ばれます。 1968年に数十年にわたって理論数学の輪の中で研究された後に、後でUNIXシステムを発明したKen Thompsonは、最初にコンピュータ分野で正規表現を使い、2つの実用的なテキスト処理ツール、qedとgrepを開発しました。大成功です。次の10年かそこらで、大手コンピュータ科学者やハッカーの大多数が正規表現について徹底的な研究と実践を行ってきました。 1980年代初頭に、UNIX運動の2つの中心、ベル研究所とカリフォルニア大学バークレー校はgrepツールのまわりで正規表現エンジンを研究して、実行しました。同時に、本 "Dragon Book"の作者であるコンパイラ "Alfred Aho"はEgrepツールを開発しました。これは正規表現の機能を大幅に拡張し強化しました。それ以来、Cプログラミング言語の作者であるBrian Kernighanの3人と共に、人気のあるawkテキスト編集言語を発明しました。 1986年までに、正規表現は飛躍的な進歩を遂げました。まず、C言語のトップハッカー、Henry SpencerがC言語で書かれた正規表現ライブラリを(当時はオープンソースと呼ばれていませんでした)公開しました。 Jay Larry Wallが生まれ、Perl言語の最初のバージョンをリリースしました。それ以来、Perlは正規表現の標準的な担い手となり、今日の正規表現の標準と地位はPerlによって形作られていると言えます。 Perl 5.xのリリース後、正規表現は安定した成熟期に入り、その強力な機能はほとんどすべての主要言語プラットフォームを征服し、すべてのプロの開発者が習得しなければならない基本的なツールとなりました。

2.DFAとNFA
推奨事項DFAとNFAの正規表現エンジンは2つのカテゴリに分類されます。1つはDFA(確定的有限オートマトン)と呼ばれるものと、もう1つは非確定的)です。性的自律機械)スムーズに動作するためには、どちらの種類のエンジンにも正規表現とテキスト文字列が必要です。サブ正規表現が表示されたら、一致する可能性のあるすべての文字列にマークを付け、次に正規表現の次の部分を調べて、新しい一致結果に基づいてラベルを更新します。 NFAは、テキストを比較し、文字を食べ、それを通常のスタイルと比較するための通常のスタイルを保持しています。そして、一致は「月の特定の日はどこ​​かで一致します!」と書き留められます。 'その後、降ります。試合がなくなったら、今食べたキャラクターを吐き出し、最後の試合に戻るまで1つずつ吐き出します。 1. DFAはテキスト文字列内の各文字を1回スキャンするだけで済みますが、機能は少なく、NFAは裏返して文字を食べて文字を吐き出す必要がありますが、速度は遅くなりますが、 Perl、Ruby、Pythonのモジュール、Javaおよび.NETの正規表現ライブラリなど、今日の主要な正規表現エンジンはすべてNFAです。 2. NFAのみがlazyやbackreferenceなどの機能をサポートしています; 3. NFAは招待することを熱望しているので、一番左の子正規スタイルが最初にマッチし、時々最高のマッチ結果が見逃されます;優先順位の一致成功 - ' 4. NFAは、デフォルトで貪欲な数量詞になります(項目4を参照); 5. NFAは再帰呼び出しのトラップに陥り、非常に動作が悪くなることがあります。ここで例を挙げて3番目の影響を説明します。たとえば、正規表現を使用します。 Perlman /はテキスト‘ perlman book’にマッチします。 NFAの場合は、正規表現を取り、テキストを見て、1文字と1文字を食べ、後で‘ perl’を食べ、最初の部分正規表現/perl /に合わせて、正規のスタイルで表示されます。上のように、記録、見下ろして‘ m’を食べる、これは悪いです、子/perl /が一致しないので、mを吐き出して、一致が成功したことを上向きに報告します‘;、もう他のことを気にする必要はなく、後者のサブレギュラー/perlman /を試してはいけません、当然より良い答えを見ることはできません。それがDFAであれば、それはテキスト指向で、テキストを手に持って、通常のスタイルを見ながら、少しずつ食べます。 /p /を食べ終わったら、‘ p’に手を掛けてメモを書き、キャラクターが合ったと言ってから、食べ尽くします。 /perl /が表示されたら、DFAは停止せずにもう一度試してみます。現時点では、最初のサブレギュラースタイルは使い尽くされていて、食べられていないので、つぶされて2番目のサブレギュラースタイル/m /が食べられます。これはまた一致したので、食べました、それで私は食べ続けました。通常のスタイルが完成するまでは、その一致が‘ perlman’との一致に成功したことに満足しています。 NFAを正しく機能させるには、/perlman |を使用する必要があります。 Perl /モード上記の例から、NFAが左端の子の一致であり、DFAが左端の子の一致である理由がわかります。実際、慎重に分析すると、NFAとDFAの違いがわかります。そしてこれらの理由を理解することは、正規表現を効果的に適用するために非常に意味があります。


正規表現の正式な定義を書くことは、冗長な数量詞?と+の定義を避けて、意図的に非常に合理化されています。a + = aa *とa?=(a | (ε)。補数演算子〜;〜RがΣ*のRに含まれていないすべての文字列のコレクションを示す場合もあります。補数演算子は、それを表現するために他の演算子を使用するので不要です(ただし、この表現の計算プロセスは複雑で、結果は指数関数的に増加する可能性があります)。この意味での正規表現は、正規言語、厳密には有限状態オートマトンによって受け入れられることができる言語クラスを表現することができます。しかし、単純さには大きな違いがあります。ある種の正規言語は、指数関数的にサイズが大きくなるオートマトンでしか記述できず、必要な正規表現の長さは直線的にしか大きくなりません。正規表現は、チョムスキー階層のタイプ3文法に対応しています。一方、正規表現と非決定論的有限状態オートマトン(NFA)の間では、このサイズの爆発を引き起こさない単純なマッピングがあります;このため、NFAは正規表現の代替表現としてよく使用されます。この形式化における表現も研究する必要があります。以下の例が示すように、異なる正規表現は同じ言語を表現できます。この形式化には冗長性があります。与えられた2つの正規表現のアルゴリズムを記述して、それらが記述する言語が本質的に等しいかどうかを判定し、各表現を最小に解析して有限オートマトンを判定し、それらが同型かどうか(等価)を判定できます。 Kleeneアスタリスクと共用体は明らかに必要ですが、それらの使用を制限することがあります。これは驚くほど難しい問題を提起します。正規表現はとても単純なので、それらを文法的に何らかの形式の指定に書き換える方法はありません。過去における公理の欠如はアスタリスクの高さに問題をもたらしました。最近、Dexter KozenはKlein代数を使って正規表現を命じました。現実世界の多くの「正規表現」エンジンは、正規表現代数で表現できない機能を実装しています。エンジンは、現在の言語をサポートされています。

エンジン型プログラムDFAのawk(ほとんどのバージョン)、egrepの(ほとんどのバージョン)、フレックス、lexのは、MySQL、Procmailの伝統的なNFA GNU Emacsに、ジャワ、grepを(大ほとんどのバージョン)、その他、.NET言語、PCREライブラリ、Perl、 PHP
(3つのセットの通常ライブラリすべて)、Python、Ruby、セット(ほとんどのバージョン)、vi POSIX NFA mawk、Mortice Lernシステムのユーティリティ、GUN Emacs(明示的に指定されたときに使われる)DFA /NFAハイブリッドGNU awk、GNU grep /egrep、Tcl

Copyright © Windowsの知識 All Rights Reserved