regex introduction

97
正規表現 入門 2009/06/06 mollifier http://d.hatena.ne.jp/mollifier/

Upload: hideaki-miyake

Post on 31-May-2015

1.038 views

Category:

Documents


1 download

DESCRIPTION

Webteko第7回で発表した"正規表現入門"の資料

TRANSCRIPT

Page 1: Regex Introduction

正規表現 入門

● 2009/06/06

● mollifier

● http://d.hatena.ne.jp/mollifier/

Page 2: Regex Introduction

正規表現って何 ?

Page 3: Regex Introduction

こんなの

ウェブテコ第 [0-9]+ 回

Page 4: Regex Introduction

こんなことはありませんか ?

Page 5: Regex Introduction

表記の揺れを考慮して検索したい

僕は Internet Explorer が大好きです。それは、 InternetExplorer が僕にちょうど良いスピードで動いてくれるからです。

それに、他では学べない IE独自の技術も勉

強できるからです。

Page 6: Regex Introduction

<h1> トマトとチキンの煮込み </h1><h2> 材料 </h2><ul> <li> トマトの水煮 </li> <li> 鶏もも肉 </li></ul>

HTML ファイルから <h*>( 見出し要素 ) の行だけ探したい

Page 7: Regex Introduction

こんな時に役に立つのが正規表現

Page 8: Regex Introduction

正規表現とは

● 文字列のパターンを表現する方法● 複雑な条件でも簡潔に表記できる

Page 9: Regex Introduction

正規表現が使用可能なツール● テキストエディタ

– 秀丸– サクラエディタ– TextMate– vim– emacs

など

Page 10: Regex Introduction

正規表現が使用可能なツール● プログラム言語

– JavaScript– Perl– Ruby– Java– C#

など

Page 11: Regex Introduction

こんなものにも

http://www.google.co.jp/codesearch

Page 12: Regex Introduction

テキストを扱うツールならたいてい使用できる

Page 13: Regex Introduction

ということは ……

Page 14: Regex Introduction

一度身につけるといろんな場面で活用できる

Page 15: Regex Introduction

ぜひとも使えるようになりたい

Page 16: Regex Introduction

というわけで、正規表現の使い方を見ていきましょう

Page 17: Regex Introduction

再び さっきの例

ウェブテコ第 [0-9]+ 回

Page 18: Regex Introduction

ウェブテコ第 [0-9]+ 回

この [0-9]+ という部分は正規表現で特別な意味を持つ

Page 19: Regex Introduction

このような文字をメタ文字と呼びます

Page 20: Regex Introduction

メタ文字の意味を理解するのが大事

Page 21: Regex Introduction

メタ文字一覧● {n,m}

● {n,}

● {n}

● ?

● +

● *

● [...]

● [^...]

● .

● \w

● \W

● \s

● \S

● \d

● \D

● \t

● \n

● \r

Page 22: Regex Introduction

まだまだあります● |

● (pattern)

● (?:pattern)

● ^

● $

● \b

● \B

● (?=pattern)

● (?!pattern)

● *?

● +?

● ??

● {n,m}?

● {n,}?

● {n}?

Page 23: Regex Introduction

Never Ending● \A

● \Z

● \z

● \G

● (?#...)

● (?<=pattern)

● (?<!pattern)

● (?>pattern)

● (?<name>pattern)

● (?ipattern)

● *+

● ++

● ?+

● {n,m}+

● {n,}+

● {n}+

Page 24: Regex Introduction

いっぱいありすぎ

Page 25: Regex Introduction

でも、よく使うのはごく一部

Page 26: Regex Introduction

よく使うもの その 1

● . ( ドット )

– 任意の 1 文字● [...]

– [ ] 内の任意の 1 文字● [^...]

– [ ] 内に含まれない任意の 1 文字

Page 27: Regex Introduction

. ( ドット ) を使う例

ミッキー .ウス

Page 28: Regex Introduction

ミッキー .ウス

● マッチする–ミッキーガウス

● マッチしない–ミッキーママウス

Page 29: Regex Introduction

[...] を使う例

今日は [456] 月です

Page 30: Regex Introduction

今日は [456] 月です

● マッチする–今日は 6月です

● マッチしない–今日は 3月です

Page 31: Regex Introduction

[ - ] で範囲の指定

今日は [0-9] 日です

Page 32: Regex Introduction

今日は [0-9]日です

● マッチする–今日は 6日です

● マッチしない–今日は 10日です

–今日は祝日です

Page 33: Regex Introduction

[^...] を使う例

今日は [^0][0-9] 日です

Page 34: Regex Introduction

今日は [^0][0-9] 日です

● マッチする–今日は 10日です

● マッチしない–今日は 06日です

Page 35: Regex Introduction

これらはすべて「何か 1 文字」 にマッチする

Page 36: Regex Introduction

よく使うもの その 2

● *

– 直前の項目を 0 回以上繰り返す● +

– 直前の項目を 1 回以上繰り返す

Page 37: Regex Introduction

* を使う例

url *=( スペースの後に *)

Page 38: Regex Introduction

url *=

● マッチする– url=”http://webteko.jp/”;

– url =”http://webteko.jp/”;

– url =”http://webteko.jp/”;

● マッチしない– url;

Page 39: Regex Introduction

+ を使う例

<div +class=”main”( スペースの後に +)

Page 40: Regex Introduction

<div +class=”main”

● マッチする– <div class=”main”

– <div class=”main”

● マッチしない– <divclass=”main”

Page 41: Regex Introduction

これらはすべて繰り返し回数を指定する

Page 42: Regex Introduction

よく使うもの その 3

● ^

– 行の先頭● $

– 行のの最後

Page 43: Regex Introduction

^ を使う例

^[0-9]

Page 44: Regex Introduction

^[0-9]

● マッチする– 3.2 文字列

● マッチしない– Opera 10 ベータ版が

リリースされました

Page 45: Regex Introduction

$ を使う例

^[0-9]+$

Page 46: Regex Introduction

^[0-9]+$

● マッチする– 0

– 177

● マッチしない– 1,000

Page 47: Regex Introduction

これらはすべて位置にマッチする

Page 48: Regex Introduction

位置を固定するところから「アンカー」とも呼ばれる

Page 49: Regex Introduction

ここまでのまとめ

Page 50: Regex Introduction

何か 1 文字にマッチする

●. ( ドット )●[...]●[^...]

Page 51: Regex Introduction

繰り返し回数を指定する

●*●+

Page 52: Regex Introduction

位置にマッチする( アンカー )

●^●$

Page 53: Regex Introduction

この 7 種類だけでもかなり凝ったことが出来る

Page 54: Regex Introduction

他にも色々メタ文字があるけど基本は同じ

Page 55: Regex Introduction

この 3 種類のどれか

● 何か 1 文字にマッチする● 繰り返し回数を指定する● 位置にマッチする

Page 56: Regex Introduction

メタ文字一覧とかを見ながら使ってみてください

Page 57: Regex Introduction

ここからが本番

Page 58: Regex Introduction

正規表現処理のしくみ

Page 59: Regex Introduction

正規表現マッチングのメカニズムについて、もう少し詳しく見

てみましょう

Page 60: Regex Introduction

例題

Page 61: Regex Introduction

パス名からディレクトリ部分を取り除きたい

● /etc/hosts -> hosts● /usr/bin/zsh -> zsh

Page 62: Regex Introduction

いきなり答え

Page 63: Regex Introduction

こんな風に置換すれば OK

● 検索する文字列^.*/

● 置換する文字列空文字列

Page 64: Regex Introduction

/usr/bin/zsh

下線部が ^.*/ にマッチする

Page 65: Regex Introduction

ん ? でも

Page 66: Regex Introduction

何通りにも解釈できるんですけど

1./usr/bin/zsh

2./usr/bin/zsh

3./usr/bin/zsh

^.*/

Page 67: Regex Introduction

結局どれ ?

Page 68: Regex Introduction

マッチング処理を最初から順番に見てみる

Page 69: Regex Introduction

/usr/bin/zsh

^ . */

開始位置が先頭に固定される

Page 70: Regex Introduction

/usr/bin/zsh

^ .* /

先頭の / が .* にマッチする

Page 71: Regex Introduction

もうちょっと詳しい説明

● .* の繰り返し回数は「何回でも良い」

Page 72: Regex Introduction

もうちょっと詳しい説明

● なので、 .* にとっては/ を「掴む」か「掴まない」か2 つ選択肢がある

Page 73: Regex Introduction

もうちょっと詳しい説明

● そういうときは「掴む」方を選ぶ● つまり長くなる方を選ぶ● この動作を「欲張り」と呼ぶ

Page 74: Regex Introduction

/usr/bin/zsh

^ .* /

次の u も .* にマッチする

Page 75: Regex Introduction

/usr/bin/zsh

^ .* /

どんどんマッチする

Page 76: Regex Introduction

/usr/bin/zsh

^ .* /

結局、全部 .* にマッチする

Page 77: Regex Introduction

/usr/bin/zsh

^ .* /

最後の / にマッチする文字がない

ない

Page 78: Regex Introduction

じゃあ、マッチ失敗 ?

Page 79: Regex Introduction

いやいや、そうじゃない

● .* は「任意の回数」のなので、最後まで掴まなくても良い

Page 80: Regex Introduction

いやいや、そうじゃない● .* が最後の h を「掴む」ことを選らんだら、全体としてマッチに失敗した

Page 81: Regex Introduction

いやいや、そうじゃない● .* が最後の h を「掴む」ことを選らんだら、全体としてマッチに失敗した

● .* が h を「掴まない」方を選んでみる

Page 82: Regex Introduction

/usr/bin/zsh

^ .* /

1 文字手放す

Page 83: Regex Introduction

/usr/bin/zsh

^ .* /

これでもマッチ失敗

Page 84: Regex Introduction

/usr/bin/zsh

^ .* /

もう 1 文字手放す

Page 85: Regex Introduction

/usr/bin/zsh

^ .* /

成功するまで手放す

Page 86: Regex Introduction

/usr/bin/zsh

^ .* /

やった ! マッチ成功

Page 87: Regex Introduction

/usr/bin/zsh

^ .* /

というわけで、全体として下線部がマッチした

Page 88: Regex Introduction

/usr/bin/zsh

ここを空文字に置換すると

Page 89: Regex Introduction

/usr/bin/zsh

ディレクトリ部分がなくなる

zsh

Page 90: Regex Introduction

繰り返し回数の選び方

● 選択肢が 2 つあったら、まずは長くなる方を試す

● 全体としてマッチに失敗したら、選ばれなかった方を試す

Page 91: Regex Introduction

言い方を変えると

● * とか + とか回数指定は欲張り

● 欲張りすぎて全体としてマッチに失敗してしまう場合は文字を手放す

Page 92: Regex Introduction

ここまで分かれば微妙な問題でもどこにマッチするか分かる

Page 93: Regex Introduction

まとめ

Page 94: Regex Introduction

まとめ● 正規表現のメタ文字は

いっぱいある

● 基本的なやつが分かってしまえば、あとは一覧表を見ながら使えば OK

Page 95: Regex Introduction

まとめ● * や + は欲張り

● 欲張りすぎてマッチに失敗するときは文字を手放す

Page 96: Regex Introduction

ぜひ、正規表現を使ってみてください

Page 97: Regex Introduction

ありがとうございました