[関連記事]正規表現を紹介--2019-08-09 9時59分10秒

オリジナル:http://106.13.73.98/__/158/

    正規表現は、また、正規表現として知られています。(英語:正規表現、コードは多くの場合、正規表現、正規表現またはREと略す)、コンピュータサイエンスの概念。正規表現は、一般的に、取得モデル(ルール)のものと行のテキストを置き換えるために使用されています。

    多くのプログラミング言語は、文字列操作のための正規表現をサポートしています。例えば、中にはPerlそれは強力な正規表現エンジンの上に構築されています。正規表現の概念は、もともとによって開発されたUnixの(のようなツールソフトウェアのsedgrepの人気の)。しばしば略さ正規表現、「正規表現」と呼ばれる、単数形は、正規表現、正規表現、持っている複雑な正規表現、正規表現、regexenを。
***

コンセプト

    正規表現は、文字列の文字を表現するために使用され、この「ルール文字列を」「文字列ルール」を形成する、事前定義された特殊文字の組み合わせ、およびこの特定の文字を使用することで、式の論理演算文字列フィルタ・ロジックのため。

簡単な紹介

    正規表現は、文字列の論理式で演算、(Zまでの間に、通常の文字(例えば、文字)、および特殊文字を含む(「メタ文字」)と呼ぶ)が予め定義された特定の文字を使用することですそして「ルール文字列」からなる特定の文字の組み合わせは、この「ルール文字列は、」列のフィルタリングロジックを発現するために使用されます。正規表現は、テキストモードで、モードが一致する検索文字列のときに、1つまたは複数のを説明しています。

起源

    人間の神経系の初期の研究者は、正規表現「発信元」の作品やバックのすべての方法をライセンス。米国ニュージャージー州のウォーレン・マカロックは、ニューラルネットワークを記述するための数学的方法の新しい方法を開発し、彼らは創造神経系におけるニューロンを説明します、生理的な側面デトロイトとウォルター・ピッツで2つの神経科学が生まれました改革の偉大な仕事をするために、小型でシンプルな自動制御要素になります。

    1951年、上のウォーレン・マカロックとウォルター・ピッツ初期の作品をもとに、「表現のニューラルネットワークイベント」と題した論文を発表した数学的科学者スティーブン・クリーネという男、定期的なコールの使用このモデルを記述するための数学記号のセットは、正規表現の概念が導入されました。正規表現は、「定期的な代数的集合」と呼ばれるその表現の一つとして記述するために使用されるので、「正規表現」という用語を採用しています。

    しばらくすると、それが仕事の結果が他の態様に適用することができることを発見しました。ケン・トンプソンが、結果は計算に適用されている置く検索アルゴリズムを以前の研究のいくつかを、ケン・トンプソンは、UNIXの主要な発明者である、Unixのは、有名なの父です。こののUnixの父シンボルエディタQEDに導入されたが、その後、エディタは、Unix上編、そして最終的にはgrepを導入しました。彼の本「Mastering Regular Expressionsを(第2版)でのジェフリー・フリードル (」 あなたは正規表現の理論についての詳細を知りたい場合は、さらに、説明で詳述した、第三版に出てきた正規表現をマスターとして翻訳中国語版)そして、歴史、あなたがこの本を読むことをお勧めします。

    それ以来、正規表現は広く、周知の大などUNIXやUNIXライクなツール、さまざまなに適用されているPerlの後に、ヘンリー・スペンサー書かれた正規表現由来Perlの正規表現はPCRE(Perl互換の正規表現のPerl互換正規表現)に進化した、PCREは、フィリップ・ヘイゼルによって開発され、ライブラリーは、多くの近代的なツールで使用されます。UnixのQEDの正規表現の最初の実用的な用途は、エディタです。

    その後、様々なコンピュータ言語でのアプリケーション開発の大半またはフォレスト内のコンピュータ技術の進化と美しい神字の音楽しいヒバリとして知られている様々なアプリケーションによる正規表現。

    上記の非常に重要な位置を占めベース今の正規表現ベースのテキストエディターと検索ツールの起源と発展の歴史を説明する正規表現です。

    最後の60年間では、正規表現は徐々にコンピュータツールと主な特徴でパッケージ化されたアプリケーションのすべてのタイプに発展、あいまいで難解な数学的概念から変更します。だけでなく、多くのUNIXツールは、正規表現をサポートし、過去20年間、WINDOWSキャンプの下で、ほとんどのWindowsの開発者キットでのアイデアやサポートの表現や組み込みアプリケーションの通常のアプリケーション!.NET Frameworkのを探検し、開発するために、MicrosoftのVisual Basic 6またはMicrosoftのVBScriptの正規表現からは、正規表現のWINDOWSシリーズは、比類のない高さの開発を支援する、ほぼすべてのMicrosoftの開発者およびすべての.NET言語は、通常使用することができます表現。あなたは、言語とコンピュータワーカー接触している場合は、あなたが主流のオペレーティング・システム(* NIX [Linuxでは、Unixの、など]、Windowsの、HP、BeOSの、など)、主流の開発言語になります(デルファイ、スカラ座、PHP、C#の、数千万ドルでJava、C ++、Objective-Cの、スウィフト、VB、Javascriptを、RubyやPythonの、など)、アプリケーションソフトウェアのすべての種類は、あなたが正規表現優雅な踊りを見ることができます。

目的

正規表現と別の文字列を考えると、我々は、以下の目的を達成することができます:

  1. 与えられた文字列は、(「マッチング」と称する)正規表現フィルタリングロジックを満たしているかどうか。
  2. はい、私たちは、正規表現による文字列から特定の部分を取得したいです。

機能

正規表現は、によって特徴付けられます:

  1. 柔軟性、ロジックと機能は非常に強力です。
  2. あなたはすぐに簡単な方法を使用して、非常に複雑な制御文字列に到達することができます。
  3. 新しく追加された人々のために、比較的あいまい。

正規表現は、メインであるため、アプリケーションオブジェクトのテキストでの様々な、それはので、テキストエディタで有名な編集者EditPlusのような小さななどのアプリケーションを持って、Microsoft Wordの、Visual Studioと他の大規模な編集者として大きなとして、あなたが処理するために正規表現を使用することができますテキストの内容。

エンジン

    定期的なエンジンは、2つのカテゴリに分けることができます:1はDFAで、1はNFAです。両方のエンジンは、これら2つのエンジンのバリエーションがたくさんあった長い歴史(20年以降)を、持っています!だから、POSIX不要な変種の継続的な導入を避けるために。その結果、主流正規エンジンは3つのカテゴリに分類される:まず、DFA、第二は、従来のNFAであり、第三は、POSIX NFAです。

    DFA彼らはバックトラック(したがって、彼らは二度同じ文字をテストすることはありません)を必要としないのでエンジンは、次の線形状態になっています。DFAエンジンはまた、可能な限り長い一致文字列を保証します。DFAエンジンは、限られた状態を含んでいるので、それは逆参照パターンと一致しないことができ、それは拡張設定を表示しないので、それは部分式をキャプチャすることができません。

    伝統的なNFAエンジンは、いわゆる「貪欲」のマッチを実行するアルゴリズムをバックトラック可能なすべての機能拡張のためのテスト、正規表現の順序を指定し、最初のマッチを受け入れることを。それは後方参照の部分式マッチ、マッチをキャプチャすることができるように、伝統的なNFAの固有の拡張は、成功した試合を達成するために、正規表現を構築するため。しかし、バック従来のNFAので、それは(状態であれば、異なる経路を介して到達する)と同じ状態を複数回アクセスすることができます。そのため、最悪の場合には、その実行速度が非常に遅くなることができます。伝統的なNFAが最初に見つかった一致を受け入れるため。そこで彼は、また、(おそらく長い)他につながる可能性が未知の一致しました。

    伝統的なNFAエンジンに似たPOSIX NFAエンジン、異なる点は次のとおりです。彼らは以前に可能な限り長いマッチを見つけ、彼らは戻って続けることを確実にすることができます。そのため、POSIX NFAエンジン速度は、従来のNFAエンジンよりも低速であり、POSIX NFAを使用した場合、あなたはおそらく長い検索に一致するのではなく、バックサーチダウンの状況を変更するために、短い一致検索をサポートするために喜んではありません。

    DFAエンジンプログラムは、主に使用してください:AWK、egrepの、フレックス、その上のlexのは、MySQL、Procmailのと。

    使用従来のNFAエンジンプログラムは、主に以下のとおりです。GNU Emacsの、ジャワ、ergp、より少ない、より多くの、.NET言語、PCREライブラリやPerl、PHP、PythonやRubyの、sedは、viの。

    使用POSIX NFAエンジンプログラムは、主に以下のとおりです。のmawk、ほぞカーンSystemsのユーティリティ、GNU Emacsのを(使用するときに明示的に指定することもできます)。

    また、DFA / NFAハイブリッドエンジンを使用する:GNU AWK、GNUのgrepを/ egrepを、Tclの。

簡単な例は、NFAとDFA作品との違いを示しています。

    たとえば、文字列これはのyansenされるブログ、正規表現/ YA(MSEN | NSEN | nsem)/(、エンジンとの違いを説明するためにのみ、ここでどのように機能するかの種類の式を気にしないでください)。次のようにNFAは、その後、後続のN(MSENアウト場合選択された分岐)かどうか一致しない場合、その後のMかどうかを検索し続ける場合、Yその後一致するかどうかを見つけるために、文字列に、動作します。その後、次にS、Eの順序は、Nかどうかを試験することにより、続いているかどうか確認するために引き続き、nは成功したマッチで、テストはしないかMです。mはなぜですか?仕事はNFA正規表現であるため、標準で、繰り返しテスト文字列なので、同じ文字列が繰り返し何度もテストされる可能性が高いです!

    DFAはそうではありません、DFAはこのの先頭からのy tのターンを見に、知られているが続き、yにナビゲートします表現がある場合、そしてちょうどここにあり、参照してください。ストリングが順次式をnテストされた後、DFA、この場合は排除MSEN要件を満たしていません。SENが会っただけNSEN n個のブランチで、マッチが成功した場合NSEN nsemと要件を満たしているが、その後、DFA順次チェック文字列が検出されました!

    エンジン作動、(NFA)の2つの完全に異なる方法でテキスト指向する表現、(DFA)につながって見ることができます!一般的に言って、DFAサーチエンジンは高速です!しかし、NFAは、表現につながった、しかし、操作しやすく、それはプログラマがNFAエンジンを好む一般的です!エンジンの二種類は、独自の強みを持っているが、それは本当にあなたの参照のニーズや使用言語に依存します!

オリジナル:http://106.13.73.98/__/158/

おすすめ

転載: www.cnblogs.com/gqy02/p/11325321.html