正規表現(入門編) 正規表現とは 岩井にとっては、得体のしれない黒魔術的なものです が ようは 単語(リテラル文字)を文法(メタ文字)で繋いで 観念を表わす表現にしたもの で、文字列の検索、置換、追加といった操作で メタ文字とリテラル文字? ファイルパターンの表し方をイメージしてください。 テキストファイルを指定する場合 *.txt と書きますが、この * の部分が、 特殊な意味を持つ文字(メタ文字) .txt の部分が 通常のテキスト文字(リテラル文字) 正規表現を利用する方法には 正規表現を利用できるコマンドで利用 (例:egrepコマンド) PHP, Java, .NETなどの言語で用意されている 引数に正規表現を与えられる関数を利用 ※ 各言語には方言があるので、同一の正規表現が 必ずしも全ての言語で使えるわけではない grep機能が用意されているようなエディタを利用す る (サクラエディタ、秀丸エディタ等) 正規表現の方言って? 言語や、環境によってサポートされている メタ文字や、その意味が異なる場合があります。 これを正規表現の「方言」と言います。 用法、用量を守って正しく使いましょう 成分表(まずはメタ文字の一部) メタ文字 名前 マッチするもの . ドット 任意の1文字 [...] 文字クラス リストの中の任意の1文字 [^...] 否定文字クラス リストに含まれていない任意の1文字 ^ キャレット 行の先頭 $ ドル記号 行の末尾 \< バックスラッシュと 小なり記号 語の先頭 \> バックスラッシュと 大なり記号 語の末尾 | パイプ 区切っているものの正規表現のどれか (...) 括弧 範囲を限定する 文字クラスは[0-6] と書くと 0,1,2,3,4,5,6 を対象に できます。[a-f]と書くと a,b,c,d,e,f を対象にできま す。 文字クラスの補足です [0-9]や[a-z]のような書き方をすることによって [0-3]と書けば、0,1,2,3を対象とするリストを作成でき ます。 [0123] と書いても [0-3]と書いても同じ事です 大文字小文字に注意 [a-z]の場合、正規表現を利用する手段に 大文字小文字を無視する機能がない限り、 大文字小文字が区別されるので、両方を対象にする 場合 [a-zA-Z] のような書き方をする必要があります。 成分表2(量指定子) メタ文字の繰り返しを表現するもので 以下のようなものがあります 方言によって使える使えないはありますが、これ以 外にも 必要最小数 マッチ試行の上限 意味 1 無制限 無限に認められ、1回は必須(少なくとも1回) 「最大量指定子」「範囲指定子」「最小量指定子」「絶 0 1 1回は認められるが、必須ではない(任意の1回) * 対最大量指定子」 0 無制限 無限に認められるが、必須ではない(いくつでもOK) ? + などがあります。 突然ですが・・・ ブロンドの女性、キャサリンとしましょう。キャサリンが 困っています。 「テキストで届いてしまったカタログの中から“グレー” の情報だけ抽出したいのに・・・某大な量で頭が痛い わ」と。 キャサリンは独身女性、現在彼氏募集中です。 さぁ皆さん、出番です。 キャサリンに良いところを見せよう 【問題】制限時間5分 エディタのgrep機能に入力してあげる正規表現を考 えてください。 【条件】 「グレー」を検索したいのですが、キャサリンの手元 にある英語のカタログはイギリスの商品も、アメリカ の商品もごちゃまぜです。 グレーは 答え合わせ 「gray|grey」とかけたアナタは、 後日キャサリンからお礼にとランチに誘われるかもし れません。 これ別な書き方もできます。 「gr(a|e)y」もしくは「gr[ae]y」です。 grの後にaもしくはeのどちらかがあって、 yが続く文字という書き方です。 他の書き方を知っている方、参考までに教えてくだ さい。 問題2 続けてお願いされちゃった・・・ 「素敵だわ!他にどんな色があるかも知りたいの “色”について書かれている部分を見られないかし ら?」 皆さん頑張って!制限時間5分で条件は同じです が、 色について補足します。 アメリカンイングリッシュでは、color ですが ブリティッシュイングリッシュでは、colour です 問題2の答え合わせ 「color|colour」と書いたアナタは正解ですが・・・ 何度も同じ方法を見せちゃうと、次からキャサリンは 自分で問題を片づけちゃうかも。 ブロンドはおバカ説を祈りましょう。 「colou?r」と書いたアナタは、 キャサリンに頼られる頼もしい人間違いなしです。 ただの良い人にならないように祈ってます。 coloの次にuがあってもなくても良く、その次がrにな る 正規表現処理のメカニズム 正規表現のエンジンタイプは2種類ある DFA(Deterministic Finite Automation) 決定性有限オートマトン テキスト主導型のエンジン NFA(Nondeterministic Fine Automation) 非決定性有限オートマトン 正規表現主導型のエンジン NFA(非決定性オートマトン) NFAエンジンは、部分式や要素を順番に見て行 き、同等の可能性を持つ2つのものについて、どち らかを選ばなければならなくなると、片方を選んだ 上で、必要になったらその分岐に戻れるように、も う片方も覚えておく ー>これが「バックトラック」機能といって特徴です やることはパンくず機能で、 NFAはヘンゼルトグレーテルとでも覚えておきましょ う DFA(決定オートマトン) DFAエンジンは文字列の操作中、「現在可能性の ある」すべてのマッチを管理している そのため、ターゲットに含まれる個々の文字は、1度 しかチェックされない。 文字がマッチしても、それが最終的なマッチの一部か どうかは不明でもエンジンが可能性のあるすべて のマッチを並行して管理しているので、1度チェック すれば十分・・・というもの。 先に進んだら後には戻らない・・・漢ですね。 POSIX NFA POSIX準拠のNFA POSIXとはIEEEが策定した、UNIXをベースとした OSの仕様、規格のこと POSIX準拠のNFAと従来型のNFAは異なります。 エンジンの差異を全部説明すると かなりのボリュームがあるので・・・かいつまんで、 どうちがうかの見分け方(特徴部分)で説明します。 自分がどれを使っているのか 従来型のNFAかPOSIX準拠のNFAか、DFAか 「nfa not」という文字列に「nfa|nfa not」を適用する 結果、「nfa」だけがマッチする場合は、従来型NFA 「nfa not」全体がマッチするなら、POSIX NFAもしく はDFAのどちらかとなる。 次に調べる事は、最小量指定子がサポートされて いるかどうか サポートされていれば、NFA (DFAは、最小量指定子がサポートされていない)
© Copyright 2024 ExpyDoc