SlideShare une entreprise Scribd logo
1  sur  26
正規表現正規表現
USP 友の会
今泉光之
@bsdhack
http://bsdhack.org
正規表現 2
講師講師
● 今泉光之
 UNIX/Linux環境でのプログラミングを中心に、ネットワークや
インフラなども含め20年以上に渡る経験だけは積んできました。
 当初はC言語でコンパイラ、Xサーバ、ドライバ、TCP/IPによる
通信などシステム系のプログラミングが主でしたが、最近はPerl
やPHPなどのWeb向けのLLも使っています。
正規表現 3
正規表現とは正規表現とは
● いくつかの文字列を一つの文字列で表現する方法
– ケン・トンプソンがエディタの検索用途に ed に実装し
たのが unix では最初だと言われている
– 英語では Regular Expression と表現する
– というか Regular Expression の和訳が正規表現
– 頻繁に RE と表記される
● POSIX 1003.2 にて規定されている
正規表現 4
grepgrep
● 正規表現との一番の接点
– ex コマンドの文字列検索コマンドが独立
– G(global) RE (Regular Expression) P (Print)
– すでに動詞として通用するがそんな単語はない
正規表現 5
何が便利なのか(その1)何が便利なのか(その1)
● HTML から H タグを見つけたい
– H1 から H6 まである
– 大文字でも小文字でも良い
● H1/h1/H2/h2/H3/h3/H4/h4/H5/h5/H6/h6
– そこで正規表現です
– '<[Hh][1-6]>'
正規表現 6
何が便利なのか(その何が便利なのか(その 22 ))
● ログファイルから IP アドレスを見つけたい
– 1.0.0.1 から 255.255.255.254 まで
– 4294967296 通り
– そこで正規表現です
– '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
– 正確には IP アドレスではないものもマッチする
正規表現 7
リテラルとメタキャラクタリテラルとメタキャラクタ
● 正規表現はリテラルとメタキャラクタから構成される
– リテラル
● 機能や特別な意味を持たず書かれた文字そのまま
– abc 、 <h1> など
– メタキャラクタ
● 特別な意味をもつ文字
– * 、 ? など
正規表現 8
正規表現の種類正規表現の種類
● 基本正規表現 (Basic Regular Expression)
– sed 、 grep 、 tr などで利用可
● unix の初期から利用されている正規表現
● 拡張正規表現 (Extended Regular Expression)
– awk 、 egrep (grep -E) などで利用可
● よりモダンな実装で機能が拡張されている
● その他
– perl 、 php 、 ruby などの言語で独自拡張されている
正規表現 9
基本正規表現のメタキャラクタ基本正規表現のメタキャラクタ 11
● .
– 任意の 1 文字にマッチ
● 改行にマッチするかは実装依存
– POSIX 1003.2 では改行にマッチ
● *
– 直前の正規表現の可能な限り大きい繰返しにマッチ
● 繰り返しは 0 回も含まれる
正規表現 10
基本正規表現のメタキャラクタ基本正規表現のメタキャラクタ 22
● ^
– 文字列の先頭にマッチ
● 処理系によっては文字列中の改行の直後(行の先頭)にも
マッチ
● $
– 文字列の末尾にマッチ
● 処理系によっては文字列中の改行の直前(行の末尾)にも
マッチ
正規表現 11
基本正規表現のメタキャラクタ基本正規表現のメタキャラクタ 33
● [ ]
– 中に置かれた文字のいずれかにマッチ
– 以下の文字がメタキャラクタとして扱われる
● ^ [ の直後だと否定
● - 文字と文字の間だと範囲指定
● ] [ の直後だとリテラルとして扱われる
● [ ] の直前だとリテラルとして扱われる
正規表現 12
基本正規表現のメタキャラクタ基本正規表現のメタキャラクタ 44
● {n}
– 直前の正規表現の n 回の繰返しにマッチ
● {n,}
– 直前の正規表現の n 回以上の繰り返しにマッチ
● {n,m}
– 直前の正規表現の n 回以上 m 回以下の繰り返しにマッチ
● 繰り返しの数は処理系に依存するが最低 256 は指定可能
正規表現 13
基本正規表現のメタキャラクタ基本正規表現のメタキャラクタ 55
● ( )
– 部分文字列をひとまとめとして扱う
– 後方参照を行うための指定
● n
– n は 1 から 9 までの整数
– 先行して現れた ( ) で囲まれた正規表現に実際にマッ
チしている文字列
正規表現 14
基本正規表現のメタキャラクタ基本正規表現のメタキャラクタ 66
● POSIX クラス
– [ ] による範囲指定の時に名前による指定が可能
● ロケールに影響される可能性がある
● 文字による範囲指定と異なる場合がある
– 使う場合は [[:alpha:]] の様に利用する
正規表現 15
基本正規表現のメタキャラクタ基本正規表現のメタキャラクタ 77
● :alnum: アルファベットと10進数字
● :alpha: アルファベット
● :blank: 空白文字(タブ、スペース)
● :cntrl: 制御文字
● :digit: 10進数字
● :graph: 印字可能で表示可能な文字
● :lower: アルファベット小文字
● :print: 印字可能文字
● :punct: 句読点
● :space: 空白文字(タブ、スペース、改ページ)
● :upper: アルファベット大文字
● :xdigit: 16進数字
正規表現 16
拡張正規表現のメタキャラクタ拡張正規表現のメタキャラクタ 11
● +
– 直前の正規表現の 1 回以上の繰返しにマッチ
– 基本正規表現の {1,} と同等
● ?
– 直前の正規表現の 0 回か 1 回の繰返しにマッチ
– 基本正規表現の {0,1} と同等
正規表現 17
拡張正規表現のメタキャラクタ拡張正規表現のメタキャラクタ 22
● |
– 演算子の左右に置かれた正規表現のいずれかにマッチ
– 基本正規表現では代替できない
● ( ) { }
– 基本正規表現で必要だった  が不要となった
●
n
– 後方参照が除外されたので使えなくなった
正規表現 18
globglob との相違との相違
● シェルの glob とは異なる
– shell で利用する * や ? とは挙動が異なる
● * あらゆる文字列(空白を含む)にマッチ
(正規表現だと .* に近い)
● ? 1 文字にマッチ
(正規表現だと . に近い)
正規表現 19
色々な正規表現色々な正規表現 11
●
usp
– 文字列 usp にマッチ
●
[Uu][Ss][Pp]
– 大文字小文字を区別しないで usp にマッチ
● u[ps][sp]
– 文字列 usp か ups にマッチ
– 文字列 uss や upp にもマッチ
●
u(sp|ps)
– 文字列 usp か ups にマッチ
正規表現 20
色々な正規表現色々な正規表現 22
● ^usp
– usp で始まる行にマッチ
● usp$
– usp で終わる行にマッチ
● us*p
– up 、 usp 、 ussp 、 ussssssssp にマッチ
正規表現 21
色々な正規表現色々な正規表現 33
● ([A-Za-z]{3})([0-9]{2}).*21
– usp03To03usp 、 Abc98%$98Abc などにマッチ
● 英字 3 文字数字 2 文字任意の 2 文字数字 2 文字英字 3 文字
● ^[A-Za-z_][A-Za-z0-9_]*
– i 、 counter 、 LoopNum 、 _tpl 、 f1 、 f2 などにマッ
チ
正規表現 22
色々な正規表現色々な正規表現 44
● [0-9]{3}-[0-9]{4}
– 123-4567 などにマッチ(郵便番号)
● [0-9]{1,3}
– 1 、 22 、 333 など 3 桁以内の数字にマッチ
● [a-z]{5,}
– abcde 、 rstuvwxyz など 5 文字以上の英小文字にマッチ
正規表現 23
色々な正規表現色々な正規表現 55
● 時間にマッチ
– [0-9]{1,2}:[0-9]{1,2}
● 99:99 などにもマッチ
– [01]?[0-9]|2[0-3]:[0-5][0-0]
正規表現 24
色々な正規表現色々な正規表現 66
● IPv4 アドレスにマッチ
– ([0-9]{1,3}.){3}[0-9]{1,3}
● 999.999.999.999 などにもマッチ
– (([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-
9]{2}|2[0-4][0-9]|25[0-5])
正規表現 25
色々な(ry色々な(ry
● URLにマッチ
– https?:(//(([-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=])*@)?([(([0-9a-f]{1,4}:){6}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|
2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|::([0-9a-f]{1,4}:){5}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|
1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|([0-9a-f]
{1,4})?::([0-9a-f]{1,4}:){4}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]
[0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(([0-9a-f]{1,4}:)?[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){3}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|
25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(([0-9a-f]{1,4}:){0,2}[0-9a-f]
{1,4})?::([0-9a-f]{1,4}:){2}([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]
[0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(([0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|
25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(([0-9a-f]{1,4}:){0,4}[0-9a-f]
{1,4})?::([0-9a-f]{1,4}:[0-9a-f]{1,4}|([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-
9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(([0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(([0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::|v[0-9a-f]+.[!$&-.0-;=_a-z~]+)]|([0-9]|[1-9][0-9]|
1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|([-.0-9_a-
z~]|%[0-9a-f][0-9a-f]|[!$&-,;=])*)(:[0-9]*)?(/([-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])*)*|/(([-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])+(/([-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!
$&-,:;=@])*)*)?|([-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])+(/([-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,:;=@])*)*)?(?([-.0-9_a-z~]|%[0-9a-f][0-9a-f]|[!$&-,/:;=?@])*)?(#([-.0-9_a-z~]|
%[0-9a-f][0-9a-f]|[!$&-,/:;=?@])*)?
– https?(://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+)
(URIの正規表現 http://sinya8282.sakura.ne.jp/?p=10640 より)
正規表現 26
色々な(ry その色々な(ry その 22
● メイルアドレスにマッチ
– (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:
[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01-x09x0bx0cx0e-x7f])*")@(?:(?:[a-
z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-
9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:
[x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])
– .+@.+..+
(Email Address Regular Expression That 99.99% Works.
http://emailregex.com/ より)

Contenu connexe

En vedette

Seminario You Tube-Marketing
Seminario You Tube-MarketingSeminario You Tube-Marketing
Seminario You Tube-Marketingedgardom
 
第21回シェル芸勉強会
第21回シェル芸勉強会第21回シェル芸勉強会
第21回シェル芸勉強会Katsuya Tashiro
 
最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)
最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)
最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)壽子 大倉
 
正規表現を覚えよう(初級編)
正規表現を覚えよう(初級編)正規表現を覚えよう(初級編)
正規表現を覚えよう(初級編)Kazuo Suzuki
 
Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)umidori
 
Bashのヒストリ展開を活用する
Bashのヒストリ展開を活用するBashのヒストリ展開を活用する
Bashのヒストリ展開を活用するbsdhack
 
FreeBSDのブートプロセス
FreeBSDのブートプロセスFreeBSDのブートプロセス
FreeBSDのブートプロセスbsdhack
 
2015.08.29 JUS共催勉強会資料
2015.08.29 JUS共催勉強会資料2015.08.29 JUS共催勉強会資料
2015.08.29 JUS共催勉強会資料umidori
 
Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)umidori
 
シェルスクリプトを極める
シェルスクリプトを極めるシェルスクリプトを極める
シェルスクリプトを極めるbsdhack
 
Linux女子部第二回勉強会usp友の会
Linux女子部第二回勉強会usp友の会Linux女子部第二回勉強会usp友の会
Linux女子部第二回勉強会usp友の会Ryuichi Ueda
 
正規表現入門
正規表現入門正規表現入門
正規表現入門thinca
 
確率ロボティクス第九回
確率ロボティクス第九回確率ロボティクス第九回
確率ロボティクス第九回Ryuichi Ueda
 
正規表現を覚えよう(中級編)
正規表現を覚えよう(中級編)正規表現を覚えよう(中級編)
正規表現を覚えよう(中級編)Kazuo Suzuki
 
ALSS14: Xen Project Automotive Hypervisor (Demo)
ALSS14: Xen Project Automotive Hypervisor (Demo)ALSS14: Xen Project Automotive Hypervisor (Demo)
ALSS14: Xen Project Automotive Hypervisor (Demo)The Linux Foundation
 
オープンソースとロボット
オープンソースとロボットオープンソースとロボット
オープンソースとロボットRyuichi Ueda
 

En vedette (20)

Seminario You Tube-Marketing
Seminario You Tube-MarketingSeminario You Tube-Marketing
Seminario You Tube-Marketing
 
第21回シェル芸勉強会
第21回シェル芸勉強会第21回シェル芸勉強会
第21回シェル芸勉強会
 
最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)
最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)
最低限のコードでWebサイトを作成しよう(ADC MEETUP 08)
 
正規表現を覚えよう(初級編)
正規表現を覚えよう(初級編)正規表現を覚えよう(初級編)
正規表現を覚えよう(初級編)
 
Como Vender en la Era de Google
Como Vender en la Era de GoogleComo Vender en la Era de Google
Como Vender en la Era de Google
 
Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)
 
Bashのヒストリ展開を活用する
Bashのヒストリ展開を活用するBashのヒストリ展開を活用する
Bashのヒストリ展開を活用する
 
FreeBSDのブートプロセス
FreeBSDのブートプロセスFreeBSDのブートプロセス
FreeBSDのブートプロセス
 
2015.08.29 JUS共催勉強会資料
2015.08.29 JUS共催勉強会資料2015.08.29 JUS共催勉強会資料
2015.08.29 JUS共催勉強会資料
 
Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)
 
シェルスクリプトを極める
シェルスクリプトを極めるシェルスクリプトを極める
シェルスクリプトを極める
 
Linux女子部第二回勉強会usp友の会
Linux女子部第二回勉強会usp友の会Linux女子部第二回勉強会usp友の会
Linux女子部第二回勉強会usp友の会
 
Awk勉強会用資料
Awk勉強会用資料Awk勉強会用資料
Awk勉強会用資料
 
Tips for bash script
Tips for bash scriptTips for bash script
Tips for bash script
 
awk入門
awk入門awk入門
awk入門
 
正規表現入門
正規表現入門正規表現入門
正規表現入門
 
確率ロボティクス第九回
確率ロボティクス第九回確率ロボティクス第九回
確率ロボティクス第九回
 
正規表現を覚えよう(中級編)
正規表現を覚えよう(中級編)正規表現を覚えよう(中級編)
正規表現を覚えよう(中級編)
 
ALSS14: Xen Project Automotive Hypervisor (Demo)
ALSS14: Xen Project Automotive Hypervisor (Demo)ALSS14: Xen Project Automotive Hypervisor (Demo)
ALSS14: Xen Project Automotive Hypervisor (Demo)
 
オープンソースとロボット
オープンソースとロボットオープンソースとロボット
オープンソースとロボット
 

正規表現