Regex takatosi
アウトライン Regexの基礎 Regexの応用 Regexエンジンの仕組み ケーススタディ
演習環境 ホスト ecn-kgws2010s.ht.sfc.keio.ac.jp –p1022
あるテキストを表現する表現手法及びその言語 メタ文字とリテラルから構成される 様々な正規表現 Regexの基礎 Regexとは Regular Expression あるテキストを表現する表現手法及びその言語 メタ文字とリテラルから構成される ls /home/* 様々な正規表現 エンジン,サポートするメタ文字,構文,etc /home/takatosi/gatsby.txt マッチ:$perl –p –e ‘m/(正規表現)/($1)/g’ file 置換:$perl –p –e ‘s/(正規表現)/($1)/g’ file
Regexの基礎 主要なメタ文字 行頭,行末 ^ $ 文字クラス […], [^…] クラス内の一つの文字にマッチ 選択 (foo|bar) 選択内の表現にマッチ オプション要素 ? 前の文字(クラス)の存在を任意にする 繰り返し + , *, {m, n} + : 一個以上存在 * : 0個以上存在 {m,n} : m回以上n回未満の繰り返し エスケープ \ 略記法 . (すべての文字), \n(改行), \t(タブ), \d(整数 [0-9]) ,\s(空白文字, タブ,スペース,改行), \w (文字 [a-zA-Z0-9_]) その他 - 大文字化 \Uhogehoge\E
Regexの基礎 主要なメタ文字
同じ表現の再度参照 キャプチャ無し括弧 the the boy has proven the theory (?:…) Regexの基礎 後方参照 同じ表現の再度参照 the the boy has proven the theory s/the the/the/g × s/\sthe the/the/g × s/\s([a-zA-Z]) \$1\s/$1/g キャプチャ無し括弧 (?:…) 効率の向上 正規表現のわかりやすさ
演習① Great Gatsbyを第三者視点の小説にかえてみよう(Iを自分のなまえにかえてみよう) 単語の先頭文字を全部大文字にしよう
Regexの応用
Regexの応用 処理エンジン Regex処理系の動作原理 エンジンの種類
First Matchが優先される The dragging belly indicates your cat is too fat Regexの応用 マッチの仕組み First Matchが優先される The dragging belly indicates your cat is too fat m/cat/ m/(fat|cat|belly|your)/
欲張りな量指定子 (+, *, {m,n}) 欲張らない量指定子 ? Regexの応用 欲張りな量指定子 欲張りな量指定子 (+, *, {m,n}) concatenated catered cathology cat m/c.*at/ 欲張らない量指定子 ? The name “McDonalds” is said “macudonarudo” in Japanese m/”.*”/ m/”[^”]*”/ m/”.*?”/
to(nite|knight|night) Regexの応用 NFAとDFA NFA (Nondeterministic Finite Automaton) 正規表現制御型 DFA (Deterministic Finite Automaton) テキスト制御型 hot tonic tonight! to(nite|knight|night)
Regexの応用 最適化
ケーススタディ
ケーススタディ IPv4アドレスのマッチング 0 ~ 255の間の4つの数字がピリオド(.)3つで区切られた文字列 例 ) 0.0.0.0, 192.168.0.1, 001.002.003.004
ケーススタディ IPv4アドレスのマッチング 悪い例 ^[0-9]+\.[0-9]+\. [0-9]+\. [0-9]+$ ^\d+\.\d+\.\d+\.\d+$ 1.22.333.444 ^\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d$ ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ 255.256.257.258 必ず3桁である必要がある => 厳密すぎる 考慮事項 1 ~ 3桁の入力を許す 0 ~ 255までの数値にマッチする
ケーススタディ IPv4アドレスのマッチング 0 〜 255までの数値にマッチ ^(0|1|2…|254|255)\. … どの桁でどの数字が許されるかの検討 \d | \d\d | [01]\d\d | 2[0-4]\d | 25[0-5] [01]?\d\d? | 2[0-4]\d | 25[0-5] ^([01]?\d\d? | 2[0-4]\d | 25[0-5])\.^([01]?\d\d? | 2[0-4]\d | 25[0-5])\.^([01]?\d\d? | 2[0-4]\d | 25[0-5])\.^([01]?\d\d? | 2[0-4]\d | 25[0-5])\.$ 一桁 \d 二桁 \d\d 三桁 (0 or 1で始まる場合) [01]\d\d 三桁 (2 で始まる場合 ) 2[0-4]\d or 25[0-5]
その他 RFC822準拠のメールアドレスのマッチング Online Regex Tester http://www.undercostruction.eu/2006/11/12/the-longest-regex-in-the-world/ Online Regex Tester http://www.regextester.com/
参考文献 詳説 正規表現 第三版,オライリーメディア 正規表現クックブック,オライリーメディア http://www.amazon.co.jp/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE-%E7%AC%AC3%E7%89%88-Jeffrey-E-F-Friedl/dp/4873113598/ref=sr_1_1?ie=UTF8&s=books&qid=1273127785&sr=8-1 正規表現クックブック,オライリーメディア http://www.amazon.co.jp/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-Jan-Goyvaerts/dp/4873114500/ref=sr_1_1?ie=UTF8&s=books&qid=1273127851&sr=1-1