正規表現 入門
- 17. 文字クラス
• -を使って範囲を示すことができる
• '[0123456789]' = '[0-9]'
• '[ABCDE...Z]' = '[A-Z]'
• '[abcde...z]' = '[a-z]'
• '[012...9ABCDEFabcdef]' = '[0-9A-Fa-f]'
• 文字クラス内ではメタ文字が異なる
• 人名として'[Ss]mith'とした場合blacksmithな
どの関係ないものにもマッチすることに注意
- 19. egrepの仕様
• $ egrep 'A[^B]' file01
• TAにはマッチしない
• Aの次には改行文字が続く
• egrepは仕様で正規表現の前に改行文字を取り
除く
- 24. 量指定子:オプション
• ?
• colou?rはc, o, l, o, u?, rならマッチ
• u?は常に成功する
• 直前のサブ式(要素)と0回または1回マッチ
• 'colou?r'
• colorとcolourにマッチ
• '1st|1' = '1(st)?'
- 27. egrep - 正規表現
^ 行頭マッチ
$ 行末マッチ
. 任意の1文字にマッチ
[ABC] A, B, Cのいずれかにマッチ
[^ABC] A, B, Cいずれでもないものにマッチ
[A-Z] A~Zのいずれかにマッチ
[^A-Z] A~Zのいずれでもないものにマッチ
c1|c2 c1, c2のいずれかにマッチ
- 28. egrep - 正規表現
+ 1回以上の繰り返し
* 0回以上の繰り返し
? 0回以上1回以下の繰り返し
{n} n回繰り返し
{n,} n回以上繰り返し
{,m} m回以下繰り返し
{n,m} n回以上m回以下繰り返し
() 範囲の限定
¥char charをエスケープ
- 29. 1. まとめ
• 正規表現は非常に便利なツールである
• egrepは簡易に検索を行うことができるが正規
表現としては弱い(表で全部ではない,はず)
• 正規表現の基礎は大体こんな感じ
• 方言が豊富なので簡単に話せない(つらい)
• 正規表現で遊びたければPerlを使おう!
- 38. 一括置換
$ find . -type f -print0 |
xargs -0 sed -i -e 's/foo/bar/g'
gitにも対応させたい
$ git grep -l 'foo' |
xargs -0 sed -i -e 's/foo/bar/g'
$ git ls-files -z |
xargs -0 sed -i -e 's/foo/bar/g'
findを使うと.gitを巻き込むっぽい
- 39. 3. 有限オートマトン
• モデルの一つ
• 有限個の”状態”の内1つの状態を取り,条件等に
より他の状態に移動することを”遷移”という
• 様々な分野に応用されている
• 正規表現エンジンにも関わるので紹介
• 深夜テンションで作ってたのでこのへんからお
かしくなりだした
- 48. 状態機械の例
• abcという文字列からなる言語
• {abc}
• abcとxyzという文字列からなる言語
• {abc, xyz}
• 3文字以上のaからなる全ての文字列
• {aaa, aaaa, aaaaa...}
• abもしくはcdが2回以上繰り返される文字列か
らなる言語
• {abab, abcd, cdcdcd...}
- 53. DFA - 判定方法
• まずは判定方法を決める必要があるが,以下の
通りとする
• 文字列の先頭から1文字ずつ調べ,その文字に
よって状態を遷移させる
• 文字列が終わったとき予め決めておいた状態な
らばこの言語に所属していると判定する
• もう少し詳細に次に記す
- 54. DFA - 判定方法
• 遷移の条件は文字である
• 開始状態を1つ決める(ここから始める).最
初の矢印が記す
• 終了状態を決める.複数でも良いし,開始状態
と重なっても良い.二重丸で表記
• また,それをオートマトンと呼ぶ
• 以下に手順を記す
- 55. DFA - 手順
1. 文字列を取得する
2. オートマトンを開始状態から始める
3. 文字列の先頭から1文字ずつ取り出す
4. 取り出した文字によって遷移
5. 繰り返し
6. 文字列の末尾に到達したとき終了状態ならば言
語に所属している
- 56. DFA - 言語に所属しない条件
• 終了状態で終了しない(通りすぎても駄目)
• 遷移先が示されない
• ABCという文字列に対し受理する,しないもの
の状態遷移図を次に描く
- 58. NFA - 手順
• 基本はDFAに準拠する
1. 遷移先が複数ある際それぞれに複製したものを
送る
2. 同時にDFAと同様に手順
3. 1つでも終了状態になったものがあれば言語に
所属
• ABCという文字列に対し受理する,しないもの
の状態遷移図を次に描く
- 62. ε-NFA - 手順
1. 1文字取り出す
2. 取り出した文字によって遷移する前に次の状態
に移る
3. 文字によって遷移
• 2の動作をε遷移という.これも非決定性
• ACという文字列に対し受理する,しないものの
状態遷移図を次に描く
- 68. NFA or others
• 'nfa|nfa not'
• nfa notに適用する
• nfaにしかマッチしないならNFA(従来型NFA)
- 69. POSIX NFA or DFA
• 'X(.+)+X'
• '=XX====================='に適用
• 時間がかかればNFA(POSIX NFA)
• すぐに終わればDFA
• オーバーフローなどの警告がでたらNFA
- 76. POSIX NFAと従来型NFA
• POSIX NFAは最長のマッチを返す
• 最左最長原則:同じ位置から複数マッチが始ま
れば最も長いテキストにマッチするものを返す
• 効率が問題になってくる
• 従来型NFAはかなり幅広い表現が可能である.
正規表現エンジンの中で最も表現力が高い
- 78. 5. まとめ
• 正規表現つおい
• 少し覚えればかなり使える
• Perlのワンライナーで一括置換とかやって楽に
• 正規表現の話が半分ぐらいしかない気がするの
で土下座
• というか入門じゃないので土下座
• 結局対象者が不透明なので土下座