View
161
Download
0
Category
Preview:
Citation preview
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
Recommended