37
正規表現 超⼊⾨ (Regular Expression) WSL 勉強会 2016/12/10 友松祐太 2016/12/10 1

Regular Expression

Embed Size (px)

Citation preview

Page 1: Regular Expression

正規表現 超⼊⾨(Regular Expression)

WSL 勉強会2016/12/10

友松祐太

2016/12/10 1

Page 2: Regular Expression

はじめに• 本スライドは本・ネットの資料を参考に作成した資料です。資

料内に誤りがあるかもしれません。。(指摘をお願いします。)

• また、スライド内で出す例はあくまで⼀例に過ぎず、別の書き⽅であったり、よりスマートな書き⽅などあるかもしれませんのでご了承お願いします。

• このスライドではごく初歩的な正規表現について紹介します。これを機に正規表現の便利さを少しでも実感してもらって、⾊々正規表現を触ってもらえるとうれしいです

2016/12/10 2

Page 3: Regular Expression

もくじ• 正規表現とは• マッチング• 1⽂字マッチング• 繰り返しマッチング• ⽂末・⽂頭マッチング• その他の正規表現

• 正規表現による置換

2016/12/10 3

Page 4: Regular Expression

正規表現とは• ⽂字列のパターンマッチングをするときの表現⽅法• 正規表現を⽤いることによってあらゆる⽂字列のパターンマッ

チングを⾏うことが出来る。

/^[a-zA-Z0-9.!#$%&ʼ*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

2016/12/10 4

もはや暗号。。

Page 5: Regular Expression

正規表現とは• ⽂字列のパターンマッチングをするときの表現⽅法• 正規表現を⽤いることによってあらゆる⽂字列のパターンマッ

チングを⾏うことが出来る。

/^[a-zA-Z0-9.!#$%&ʼ*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

2016/12/10 5

ある程度この正規表現が読めるようになります!

Page 6: Regular Expression

正規表現とは• では、どんなときに使う?

• パターンにマッチしたファイル名のファイルを探す(hoge| grep huga)• フォームに⼊⼒された⽂字列が指定通りになっているかチェック• ⽂字列置換• …

ここで紹介しきれないくらいさまざまな利⽤シーンがあります

2016/12/10 6

Page 7: Regular Expression

正規表現とは• 正規表現は⾔語などの環境によって若⼲⽅⾔が存在します。(ほ

とんどの⽂法は同じ)• 今回はAtomで使える⽂法でご紹介します

• AtomをインストールしてCmd+Fで検索画⾯を出して→のような設定にしてください

2016/12/10 7

正規表現の利⽤

⼤⽂字と⼩⽂字の区別

をする

Page 8: Regular Expression

1⽂字マッチング

2016/12/10 8

Page 9: Regular Expression

1⽂字マッチング -特定の1⽂字-• aとマッチングさせたい• a• 単純にaとすれば”a”とマッチング出来る。

• 1とマッチングさせたい• 1

特定の1⽂字とマッチさせたいときはその⽂字を直接指定すればよい。

2016/12/10 9

Page 10: Regular Expression

1⽂字マッチング -数字1⽂字-• 半⾓数字0,1,2,3,4,5,6,7,8,9のどれか1⽂字とマッチさせたい• \d• あるいは[0-9]…後程解説

• 数字以外の1⽂字とマッチさせたい• \D• あるいは[^0-9]…後程解説

2016/12/10 10

Page 11: Regular Expression

1⽂字マッチング -英数字-• 英数字{a, b, …, z, A, B, …, Z, 0, 1, …, 9,_}1⽂字とのマッチング• \w• あるいは[a-zA-Z0-9_]

• 英数字以外の1⽂字とのマッチング• \W• あるいは[^a-zA-Z0-9_]

2016/12/10 11

Page 12: Regular Expression

1⽂字マッチング -空⽩⽂字-• 空⽩⽂字(半⾓・全⾓スペース、改⾏、タブ等)とマッチング• \s• あるいは[\f\n\r\t\v]

• 空⽩⽂字以外とマッチング• \S• あるいは[^\f\n\r\t\v]

2016/12/10 12

Page 13: Regular Expression

特殊⽂字• 改⾏• \n

• タブ区切り• \t

• 正規表現のメタキャラクター• 先頭に\をつける(エスケープする)• メタキャラクター⼀覧• . * + ? ( ) [ ] ^ $ \

2016/12/10 13

Page 14: Regular Expression

1⽂字マッチング-候補マッチング-• 候補の中から1⽂字にマッチング

• []の中にマッチさせたい1⽂字の候補を羅列する例) [abc]aかbかcにマッチングする例) [012]0か1か2にマッチングする

• 候補以外の1⽂字にマッチング• [^]の中にマッチさせたい1⽂字の候補を羅列

例) [^abc]a,b,c以外の1⽂字にマッチ

2016/12/10 14

Page 15: Regular Expression

1⽂字マッチング-候補マッチング(範囲指定)-• 候補の中の1⽂字にマッチング【応⽤編】• [a-z] のように指定すると a~z のどれか1⽂字にマッチさせられる。

例)[^a-zA-Z0-9_]英数字アンスコ以外の1⽂字にマッチング(=\W)

2016/12/10 15

Page 16: Regular Expression

1⽂字マッチング -任意の1⽂字-• なんでもいいので1⽂字とマッチさせたい• .(ピリオド)

例)A.CでマッチングABC, AAC, AaC, A1C, …などにマッチする

2016/12/10 16

Page 17: Regular Expression

1⽂字マッチング構⽂ マッチする⽂字a “a”とマッチ\d 数字1⽂字とマッチ\D 数字以外の1⽂字とマッチ\s 空⽩⽂字1⽂字とマッチ\S 空⽩⽂字以外の1⽂字とマッチ\w 英数字アンスコ1⽂字とマッチ[a-zA-Z0-9_]\W 英数字アンスコ以外の1⽂字とマッチ. 任意の1⽂字とマッチ[…] []の中に羅列した中の1⽂字にマッチ[^… ] [^]の中に羅列した⽂字以外にマッチ[a-z] aからzの中のどれか1⽂字にマッチ

2016/12/10 17

Page 18: Regular Expression

繰り返しマッチング

2016/12/10 18

Page 19: Regular Expression

繰り返しマッチング• 直前のパターンの1回以上の繰り返し

• “+”(プラス記号)

例1) GRe+NGReN, GReeN, GReeeN, GReeeeN, GReeeeeN,…にマッチする

例2)\d+0,1,2,11,12,00000,999231231,23454,…数字の連続にマッチする。2016/12/10 19

Page 20: Regular Expression

繰り返しマッチング• 直前のパターンの0回以上の繰り返し• *(アスタリスク)

例)GRe*NGRN, GReN, GReeN, GReeeN, GReeeeN, GReeeeeN,…にマッチ↑*だとこのパターンが存在

2016/12/10 20

Page 21: Regular Expression

繰り返しマッチング• 直前のパターンの0回か1回の繰り返し• ?

例)apples?appleとapplesにマッチする

look(ed)?lookとlookedにマッチする

2016/12/10 21

Page 22: Regular Expression

繰り返しマッチング• 直前のパターンの任意の回数の繰り返し• {n} …n回の繰り返し• {n,m} …n回以上,m回以下の繰り返し

• {0,1}は?と同値• {n,} …n回以上の繰り返し

• {0,}は*と同値、{1,}は+と同値

例)GRe{4}N … GReeeeNにマッチGRe{4,}N … GReeeeN, GReeeeeN, GReeeeeeN,…にマッチ

2016/12/10 22

Page 23: Regular Expression

繰り返しマッチング

正規表現* 直前のパターンの0回以上の繰り返し+ 直前のパターンの1回以上の繰り返し? 直前のパターンの0回または1回{n} 直前のパターンのn回の繰り返し{n,m} 直前のパターンのn回以上m回以下の繰り返し{n,} 直前のパターンのn回以上の繰り返し

2016/12/10 23

Page 24: Regular Expression

⽂末・⽂頭マッチング

2016/12/10 24

Page 25: Regular Expression

⽂頭記号/⽂末記号• ⽂頭は^で表す。• 正規表現の先頭に^を指定する。

• ⽂末表現は$で表す。• 正規表現の末尾に$を指定する。

例)Thisで始まって.(ピリオド)で終わる⾏とのマッチ^This.*\.$

2016/12/10 25

Page 26: Regular Expression

その他の正規表現

2016/12/10 26

Page 27: Regular Expression

ORマッチ• 2つの⽂字列のどちらかにマッチさせたい。• |(パイプ)で結ぶ

例)Windows|WINDOWSWindowsあるいはWINDOWSにマッチ

例)Windows|WINDOWS|windowsWindows,WINDOWS,windowsにマッチ

2016/12/10 27

Page 28: Regular Expression

ブロック• ()でくくるとブロック化出来ます。

例 (ab)+ab,abab,ababab,…にマッチする。

例 W(indows|INDOWS)Windows,WINDOWSにマッチ

例 GRee(ee)?NGReeN,GReeeeNにマッチ

2016/12/10 28

Page 29: Regular Expression

正規表現による置換

2016/12/10 29

Page 30: Regular Expression

正規表現による置換• 正規表現による置換を使うことで「ちょっとしたデータ整形を

したい」や「この部分取ってきたい」みたいな作業をやるにはかなり有効である。

• いろいろな例で説明します!

2016/12/10 30

Page 31: Regular Expression

正規表現による置換• ()で括ると()内のマッチした部分を記憶する(取り出す)ことがで

きる。

例) www.example.com/layer_1/layer_2/ex.htmlここからドメインだけを取得したい

^([^/]+)/.*$ ---replace--> $1

結果:www.example.com

2016/12/10 31

カッコで括った部分にマッチした部分を$で取得することができる

Page 32: Regular Expression

正規表現による置換• 空⾏を消したい• ^\n ---replace--> (空⽂字列)

• ⽂末のカンマを消したい• ,$ ---replace--> (空⽂字列)

• TSV,CSVの各要素を””で囲いたい• ([^\t]+) ---replace--> ”$1”• ([^,]+) ---replace--> ”$1”

2016/12/10 32

Page 33: Regular Expression

正規表現による置換• 情報科学科の学籍番号をmeijiメールのアドレスに変換\d{3}R\d(\d{5}) ---replace--> [email protected]例えば…157R127112 --replace--> [email protected]

• 学籍番号を何年度卒業の何番に変換\d{3}R\d(\d{2})(\d{3}) ---replace--> 平成$1年度卒業$2番例えば…157R127112 ---replace--> 平成27年度⼊学112番

2016/12/10 33

Page 34: Regular Expression

正規表現による置換• htmlからタグだけを取り出す• (\<[^\>]*\>) ---replace--> \n$1\n• ^(\n|[^<])* ---replace--> 空⽂字列

2016/12/10 34

Page 35: Regular Expression

CSV・TSVのカラム取り出し• CSVのk列⽬のカラムを取り出したい。

^([^,\n]+,){k-1}([^,\n]+)[^\n]*$ ---replace--> $2

• TSVのk列⽬のカラムを取り出したい。

^([^\t\n]+\t){k-1}([^\t\n]+)[^\n]*$ ---replace--> $2

2016/12/10 35

Page 36: Regular Expression

Thank you for your attention!

2016/12/10 36

Page 37: Regular Expression

参考

• (メールアドレスを表す現実的な正規表現) [http://qiita.com/sakuro/items/1eaa307609ceaaf51123]• (サルにもわかる正規表現⼊⾨)

[http://www.mnet.ne.jp/~nakama/]• (正規表現サンプル集 - メガソフト トップ)

[http://www.megasoft.co.jp/mifes/seiki/]• (正規表現 Wikipedia)

[https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE]

2016/12/10 37