dive into /regexp?

49
DIVE INTO DIVE INTO /regexp?/ /regexp?/ nasa9084 nasa9084 DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf 1 / 49 2016年03⽉22⽇ 00:42

Upload: -

Post on 21-Jan-2017

155 views

Category:

Engineering


0 download

TRANSCRIPT

DIVE INTODIVE INTO/regexp?//regexp?/

nasa9084nasa9084

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

1 / 49 2016年03⽉22⽇ 00:42

正規表現正規表現Regular Expression

ある規則に適合する文字列を探すための記法

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

2 / 49 2016年03⽉22⽇ 00:42

利点利点

一つの文字列で複数の文字列を表すことができる

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

3 / 49 2016年03⽉22⽇ 00:42

例えば・・・例えば・・・

"a"で始まる".txt"で終わる

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

4 / 49 2016年03⽉22⽇ 00:42

用途用途

greppage/pg/more/less各種プログラミング言語emacs/vim

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

5 / 49 2016年03⽉22⽇ 00:42

構成要素構成要素

通常文字ほとんどの文字

特殊文字(メタ文字)正規表現で特別な意味を持つ文字

→「正規表現の説明」≒「メタ文字の説明」

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

6 / 49 2016年03⽉22⽇ 00:42

基本と拡張基本と拡張

正規表現には大きく3つ

基本正規表現 (BRE)grepなどのデフォルト

拡張正規表現 (ERE)egrep, grep -Eなど

Perl正規表現Perlを始めとするプログラミング言語

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

7 / 49 2016年03⽉22⽇ 00:42

よくある書き方よくある書き方

/hogehoge/

デリミタ(区切り文字)で挟む

→Perlでの書き方

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

8 / 49 2016年03⽉22⽇ 00:42

置換演算子(Perl)置換演算子(Perl)s/hoge/piyo/

→hogeをpiyoに置き換える

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

9 / 49 2016年03⽉22⽇ 00:42

メタ文字メタ文字特別な意味を持つ文字

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

10 / 49 2016年03⽉22⽇ 00:42

..NULL文字を除く任意の一文字

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

11 / 49 2016年03⽉22⽇ 00:42

**直前の文字の0回以上回数の繰り返し

BREとEREで扱いが少し違う

BRE先頭の*は通常文字として扱われる

ERE文字だけではなく正規表現も使える

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

12 / 49 2016年03⽉22⽇ 00:42

^̂行の先頭・文字列の先頭

BRE正規表現の先頭でのみメタ文字

EREどこでもメタ文字

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

13 / 49 2016年03⽉22⽇ 00:42

$$行の末尾・文字列の末尾

BRE正規表現の末尾でのみメタ文字

EREどこでもメタ文字

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

14 / 49 2016年03⽉22⽇ 00:42

\\エスケープ

直後のメタ文字を通常文字として扱う

または

通常文字と組み合わせてメタ文字とする

\$500C:\\

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

15 / 49 2016年03⽉22⽇ 00:42

[…][…]ブラケット表現

[ ]の間に書いた文字のうち一つとマッチする

-を使うと範囲指定もできる

先頭に ^を書くと否定の意味

→[^ ]の間に書いた文字以外とマッチする

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

16 / 49 2016年03⽉22⽇ 00:42

例例

[a-z]英小文字にマッチ

[aeiou]母音にマッチ

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

17 / 49 2016年03⽉22⽇ 00:42

\{m,n\} {m,n}\{m,n\} {m,n}インターバル表現

直前の文字のm回以上n回以下の繰り返し

BRE\{m,n\}

ERE{m,n}

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

18 / 49 2016年03⽉22⽇ 00:42

EREで使えるメタ文字EREで使えるメタ文字

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

19 / 49 2016年03⽉22⽇ 00:42

( )( )グルーピング

文字列・正規表現をグループ化できる

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

20 / 49 2016年03⽉22⽇ 00:42

++直前の文字・正規表現の 1回以上の繰り返し

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

21 / 49 2016年03⽉22⽇ 00:42

??直前の文字・正規表現が0回または1回

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

22 / 49 2016年03⽉22⽇ 00:42

例例

/regexp?/

→"regex", "regexp"にマッチ

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

23 / 49 2016年03⽉22⽇ 00:42

||ORの意味

直前の正規表現または直後の正規表現に一致

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

24 / 49 2016年03⽉22⽇ 00:42

例例

/read|write/

→"read", "write"にマッチ

/(P|p)ython/

→"Python", "python"にマッチ

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

25 / 49 2016年03⽉22⽇ 00:42

文字クラス文字クラス複数の文字をまとめたもの

→ブラケット表現のこと

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

26 / 49 2016年03⽉22⽇ 00:42

POSIX文字クラスPOSIX文字クラスBRE

[[:hoge:]]ERE

[:hoge:]

→これもブラケット表現と呼ぶ

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

27 / 49 2016年03⽉22⽇ 00:42

文字クラス文字クラス

文字クラス 内容 等価な表現

[:alnum:] アルファベットと数字 [0-9a-zA-Z]

[:alpha:] アルファベット [a-zA-Z]

[:lower:] 小文字アルファベット [a-z]

[:upper:] 大文字アルファベット [A-Z]

[:digit:] 数字 [0-9]

[:xdigit:] 16進数数値 [0-9a-fA-F]

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

28 / 49 2016年03⽉22⽇ 00:42

文字型文字型

ブラケット表現の略記

文字型 内容

\l 半角小文字アルファベット

\u 半角大文字アルファベット

\d 数字

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

29 / 49 2016年03⽉22⽇ 00:42

後方参照後方参照置換でよく使われる

EREでは仕様には無い

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

30 / 49 2016年03⽉22⽇ 00:42

\x\xxは1,2,3,…

事前にで括ったグループを順に使える

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

31 / 49 2016年03⽉22⽇ 00:42

例1例1'や"で囲まれた部分を探したい

/\(['"]\).*\1/

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

32 / 49 2016年03⽉22⽇ 00:42

例2例2"¥900"や"¥50"の様な箇所をすべて"900円"や"50円"の形に直したい

→置換の検索で正規表現を使う

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

33 / 49 2016年03⽉22⽇ 00:42

使い方使い方

検索文字列¥\([:digit:]+\)

置換文字列\1円

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

34 / 49 2016年03⽉22⽇ 00:42

非欲張り指定子非欲張り指定子

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

35 / 49 2016年03⽉22⽇ 00:42

欲張り指定子欲張り指定子

* , + , ? , \{m,n\} , {m,n}

→基本的に欲張り(最左最長一致)

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

36 / 49 2016年03⽉22⽇ 00:42

どういうことか?どういうことか?

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

37 / 49 2016年03⽉22⽇ 00:42

HTMLの編集HTMLの編集<div>div</div>を<div>span</div>に変えたい

検索文字列(</?).*(>)

置換文字列\1span\2

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

38 / 49 2016年03⽉22⽇ 00:42

perlを使ってやってみようperlを使ってやってみよう$w = "<div>div</div>を<div>span</div>に変えたい!";$w =~ s#(</?).*(>)#\1span\2#g;print $w;

結果

<span>に変えたい!

https://ideone.com/4LGPGm

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

39 / 49 2016年03⽉22⽇ 00:42

なんかちがう!なんかちがう!

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

40 / 49 2016年03⽉22⽇ 00:42

理由理由

一致する最長で選ぶ

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

41 / 49 2016年03⽉22⽇ 00:42

非欲張り指定子非欲張り指定子

欲張り指定子 : * , + , ? , \{m,n\} , {m,n}

→非欲張り指定子 : *? , +? , ?? , \{m,n\}? , {m,n}?

これで最短一致する

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

42 / 49 2016年03⽉22⽇ 00:42

perlを使ってやってみよう ver.2perlを使ってやってみよう ver.2$w = "<div>div</div>を<div>span</div>に変えたい!";$w =~ s#(</?).*?(>)#\1span\2#g;print $w;

結果

<span>div</span>を<span>span</span>に変えたい!

https://ideone.com/R2lpII

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

43 / 49 2016年03⽉22⽇ 00:42

THINKING TIME!THINKING TIME!

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

44 / 49 2016年03⽉22⽇ 00:42

例題をちょこっと例題をちょこっと

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

45 / 49 2016年03⽉22⽇ 00:42

例題1例題1

以下にマッチする正規表現

WindowsWINDOWSWindows95WINDOWS95Windows 95WINDOWS 95

以下同様に

982000XP788.110

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

46 / 49 2016年03⽉22⽇ 00:42

回答例1回答例1W(indows|INDOWS) ?(9[58]|2000|XP|7|8(\.1)?|10)

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

47 / 49 2016年03⽉22⽇ 00:42

例題2例題2<a href="hoge">hogehoge</a><a href="piyo">piyopiyo</a><a href="fuga">fugafuga</a>

↓<a href="hoge" target="_blank">hogehoge</a><a href="piyo" target="_blank">piyopiyo</a><a href="fuga" target="_blank">fugafuga</a>

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

48 / 49 2016年03⽉22⽇ 00:42

回答例2回答例2s#<(.+?)>(.+)<(.+)>#<\1 target="_blank">\2<\3>#g

DIVE INTO <b><code>/regexp?/</code></b> file:///home/nasa/Dropbox/digi-poro/#5/into_regex.html?print-pdf

49 / 49 2016年03⽉22⽇ 00:42