Transcript 正規表現(入門
正規表現(入門編)
正規表現とは
岩井にとっては、得体のしれない黒魔術的なものです
が
ようは
単語(リテラル文字)を文法(メタ文字)で繋いで
観念を表わす表現にしたもの
で、文字列の検索、置換、追加といった操作で
メタ文字とリテラル文字?
ファイルパターンの表し方をイメージしてください。
テキストファイルを指定する場合
*.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は、最小量指定子がサポートされていない)