SlideShare a Scribd company logo
1 of 61
はじめての正規表現
∼仕事を楽しくするエッセンシャル∼
author:@suwork
1
本テキストの対象者
• 正規表現ってなに?とのピュアな人
• テキストエディタで検索ウィンドウを開いたと
きに「正規表現」にチェックが入っていない人
• サクラエディタ、秀丸エディタなどのWindows
のテキストエディタを扱う人(※)
※テキスト内でWindowsに対応したテキストエディタを用います
(正規表現とWindowsは関係ありません)
2
テキストに入る前に……
• 本テキストはWindows7マシン+iCloud keynote(beta)
で作成しています
• テンプレートは「Azusa Colors」を利用しています。あ
りがとうございます(http://memo.sanographix.net/
post/113681262780)
• 本テキストが完成する30分前に、iCloudが変な同期を
行い、keyファイルが壊れました(復元不可)。……こ
れは思い出して書き直したのだよ
3
正規表現ってなに?
• 正規表現は、強力で柔軟、かつ効率的なテキ
スト処理の を握る存在だ。
4
• さまざまな用途に対応できる能
力と表現力を持った一般的なパ
ターン言語が発達してきた。
(略)このパターン言語とパ
ターン自体を正規表現と呼ぶ。
オライリー・ジャパン
詳説 正規表現 第3版 より抜粋
結局、正規表現ってなに?
• かの偉い人は言いました
5
• ……若干意味を取り違えている気がします
が、手を動かして試していきましょう
プログラマーの格言34(盗作多し)
目で追う暇があるなら動かせ。脳細胞よりもCPUの
ほうが解析が速い。そして、その間、休める。
出典:プログラマーの格言(盗作多し)(http://www2.biglobe.ne.jp/oni_page/other/etc/pr03.html)より
このテキストに必要なもの
テキストエディタ
6
みんな大好きサクラエディタでいいよ!
#僕は秀丸を使うね!
テキストエディタの設定
• 検索ウィンドウの正規表現にチェックを入れ
るべし
7
正規表現ってなに? Part2
• こんなことがありました
8
上司「郵便番号と住所を一つの項目で管理しているウェブシステムが、
今度のシステム開発で郵便番号と住所を別項目で管理するようになるん
だよね。それで住所項目から郵便番号を導出して移行する必要があるん
だけど、現状の住所項目の登録内容を見ると郵便番号が入っていたり、
入っているけど書式が正しくなかったりしていて、どれくらい工数が必要
か検討がつかないんだよね。80万行くらいのCSVファイルなんだけど、
ざっくりでいいから郵便番号がちゃんと設定されていないレコード数を
教えてくれる?完璧な結果は必要はないけど、精度が高いと嬉しい。CSV
ファイルはサーバに圧縮して置いてあるから。なるべく早めに欲しいな
あ(意訳:早くよこせ)」
僕「アッハイ」
正規表現ってなに? Part2
• 長い、長いけどひとまず整理をすると……
1. 80万行くらいのCSVファイルの
2. 住所項目に郵便番号が設定されていないレ
コードを探す
3. 精度は高いほうが良い
4. 早めに欲しい
9
正規表現ってなに? Part2
• データサンプルは以下のとおり
10
名前,取扱支店,発注回数,住所,電話番号,カラムN
S名N子,近畿支店,21,530-0001 大阪府 ●●…,999-0412-0109,新作ドーナッツ
の試食
I十嵐K子,中国支店,59,680-0001 鳥取県 ●●…,999-0906-0056,家事全般
Y口M羽,関東支店,14,千葉県 ▲▲…,999-0514-0033,メール
Jヶ崎M嘉,関東支店,43,330-0002 埼玉県 ▲▲…,999-0144-0206,カラオケ
M方A海,東北支店,37,030-001 青森県 ●●…,999-0858-0559,指の運動
F居T,近畿支店,64,滋賀県 ■■…,999-0834-0566,占い
O石I,中部支店,60,410-0001 静岡県 ■■…,999-0635-0758,プログラミング
M川Mく,近畿支店,88,530-0002 大阪府 ●●…,999-0062-0464,猫カフェ巡り
T時A梨,東北支店,84,010-00001 秋田県 ▲▲…,999-0135-0619,ケーキ作り
H口Aやめ,近畿支店,15,三重県 ▲▲…,999-0006-0878,時代劇鑑賞、忍者グッズ収
集、撮影所巡り
正規表現ってなに? Part2
• さあ、こんな時はどうやって探そう?
11
1. CSVならExcelが得意!Excelに貼り付けてどうにかしよ
う
→ 80万行のファイルを!やりたくない
2. 簡単なスクリプトでも作るか……
→ 精度を求めているので、バグは厳禁(自信があるならどうぞ)
3. 俺の目に任せろ(目視で件数を数える)
→ その根性は別のタイミングにとっておいて下さい
正規表現ってなに? Part2
• 冷静になってレコードを見てみると、法則が
あります
12
1. CSV(カンマ区切り)との法則
2. 郵便番号(3桁数字+ハイフン+4桁数
字)との法則
• このようにある程度の法則がある場合、「正規表
現」が有用です
正規表現ってなに? Part2
• 以下の文字列を設定して検索してみよう
13
(?<=^([^,]*,){3})(?!
d{3}-d{4}[^d])
※「」は「¥」の半角
正規表現ってなに? Part2
• すごい、それっぽいレコードが取得できた!(スマン、秀丸だけの方言が
入ってるかも知れない)
14
そもそも郵便番号を入力していないレコード
入力しているが書式を誤っているレコード
正規表現ってなに? Part2
15
これはスゴイ(大
豆ではない)
※スゴイダイズは大塚チルド食品株式会社の製品です
正規表現ってなに? Part2
• スゴイだけで終わってはいけません。検索に
使った文字列の意味は……?
16
(?<=^([^,]*,){3})(?!d{3}-d{4}[^d])
郵便番号の書式が存在し
ないことを表現
先頭から3番目のカンマ
区切りの位置取りを表現 +
=先頭から3番目のカンマ区切りの後ろに、郵便番号が
存在しないレコードを検索対象とする、としているのだ
正規表現ってなに? Part2
• 「としているのだ」と宣言されても、複雑怪
奇な文字列でなぜ検索できるのだろう?
• この複雑怪奇な文字列の塊がまさに「正規
表現」なのである
17
正規表現ってなに? Part2
• 黄色文字は位置であったり、文字であったり、その繰り返し等を定
義したりする文字
「メタ文字」と呼びます
• 紫色文字は文字そのもの
「リテラル文字」と呼びます
• 正規表現は、メタ文字とリテラル文字の組み合わせで強力な文
字列パターンを表現することが可能
18
(?<=^([^,]*,){3})(?!d{3}-d{4}[^d])
正規表現ってなに? Part2
• 正規表現はメタ文字の使いっぷりですべてが
決まります(良くも悪くも)
• むしろメタ文字を制するもの正規表現を制す
と言って過言ではない。メタ文字の仕様(役
割)を理解しよう
• 次のページから基本的な正規表現を学んでい
きましょう!
19
位置を表現:^(ハット記号)
• 文字列にはマッチせず、文字列の先頭を表現
する特殊なメタ文字です
• ハット記号単体で先頭に文字を挿入したい場
合やリテラル文字と組み合わせて、先頭文字
に対してxxしたいなどの時によく使います
20
※正式名称
位置を表現:^(ハット記号)
• 先頭に文字を入力してコマンドを作る
21
WS000017.JPG
WS000016.JPG
WS000015.JPG
WS000014.JPG
…
del WS000017.JPG
del WS000016.JPG
del WS000015.JPG
del WS000014.JPG
…
検索 ^
置換 del△
位置を表現:^(ハット記号)
• 特定のレコードから始まる行だけを消す
22
属性,名前,取扱支店,...
cu,S名N子,近畿支店,...
cu,I十嵐K子,中国支店,...
cu,Jヶ崎M嘉,関東支店,...
co,M方A海,東北支店,...
co,F居T,近畿支店,...
co,O石I,中部支店,...
pa,M川Mく,近畿支店,...
pa,T時A梨,東北支店,...
pa,H口Aやめ,近畿支店,...
検索 ^cu.+n
置換
属性,名前,取扱支店,...
co,M方A海,東北支店,...
co,F居T,近畿支店,...
co,O石I,中部支店,...
pa,M川Mく,近畿支店,...
pa,T時A梨,東北支店,...
pa,H口Aやめ,近畿支店,...
位置を表現:$(ドル記号)
• 文字列にはマッチせず、文字列の末尾を表現
する特殊なメタ文字です
• ハット記号は先頭ですが、ドル記号は末尾を
表します。ドル記号単体で末尾に何か文字を
入れたり、リテラル文字と組み合わせて末尾
の文字列を特定したりすることが可能です
23
位置を表現:$(ドル記号)
• (こんな使い方はしないと思いますが)末尾に文字列を追加する
24
ブラックニッカスペシャル
ブラックニッカ 8年
ブラックニッカ クリア
フロム・ザ・バレル
スーパーニッカ
鶴 17年
オールモルト
検索 $
置換 を購入する
ブラックニッカスペシャルを購入する
ブラックニッカ 8年を購入する
ブラックニッカ クリアを購入する
フロム・ザ・バレルを購入する
スーパーニッカを購入する
鶴 17年を購入する
オールモルトを購入する
位置を表現:$(ドル記号)
• 末尾の更新年月だけを消す(作成月は残す)
25
カラム,作成月,更新月
あああ,2015-01,2015-01
いいい,2015-01,2015-01
ううう,2014-12,2015-01
えええ,2014-11,2015-01
おおお,2014-06,2015-01
検索 ,2015-01$
置換
カラム,作成月,更新月
あああ,2015-01
いいい,2015-01
ううう,2014-12
えええ,2014-11
おおお,2014-06
位置を表現:^ $
• ハット記号とドル記号は組み合わせで絶大な
パワーを発揮します。例えばファイル名が
「suwork」であること正規表現で調べようと
すると……
26
検索文字 判定結果 理由
suwork sssuworkkkで検索できてしまう
^suwork suworkkkで検索できてしまう
suwork$ sssuworkで検索できてしまう
^suwork$ ○
先頭がsでuworと続き、末尾がkであ
ることを保証
単一の文字とマッチ:.(ドット)
• ドット記号は何かの文字にマッチするメタ文
字です
• 後述する量指定子と組み合わせることで、
マッチの幅が広がります
27
単一の文字とマッチ:.(ドット)
• 誕生日が10日以降の値を特定する
28
住所,電話番号,誕生日
大阪,999-0412-0109,10月10日
鳥取,999-0906-0056,8月10日
青森,999-0858-0559,8月1日
大阪,999-0062-0464,2月22日
滋賀,999-0834-0566,7月1日
秋田,999-0135-0619,12月8日
検索 月..日$
住所,電話番号,誕生日
大阪,999-0412-0109,10月10日
鳥取,999-0906-0056,8月10日
青森,999-0858-0559,8月1日
大阪,999-0062-0464,2月22日
滋賀,999-0834-0566,7月1日
秋田,999-0135-0619,12月8日
文字クラス:[](ブラケット)
• ブラケットは[]の中に含めた文字のいずれかと一致す
るメタ文字です
• ハイフン(-)を使うことで文字の範囲を表現すること
が可能です
29
検索文字 マッチする文字
[a-z] abcdefghijklmnopqrstuvwxyz のいずれか
[A-Z] ABCDEFGHIJKLMNOPQRSTUVWXYZ のいずれか
[0-9] 0123456789 のいずれか
[a-zA-Z0-9]
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 のいずれか
文字クラス:[](ブラケット)
• htmlドキュメント内の<h>(Heading)ダグを特定する
30
<h1>ヘッダ1</h1>
<div>
<h2>ヘッダ2</h2>
<div>
<h3>ヘッダ3</h3>
<h4>ヘッダ4</h4>
<h5>ヘッダ5</h5>
</div>
</div>
検索 <h[123456]>
<h1>ヘッダ1</h1>
<div>
<h2>ヘッダ2</h2>
<div>
<h3>ヘッダ3</h3>
<h4>ヘッダ4</h4>
<h5>ヘッダ5</h5>
</div>
</div>
文字クラス:[](ブラケット)
• htmlドキュメント内の<h>(Heading)ダグを特定する2
31
<h1>ヘッダ1</h1>
<div>
<h2>ヘッダ2</h2>
<div>
<h3>ヘッダ3</h3>
<h4>ヘッダ4</h4>
<h5>ヘッダ5</h5>
</div>
</div>
検索 <h[1-6]>
<h1>ヘッダ1</h1>
<div>
<h2>ヘッダ2</h2>
<div>
<h3>ヘッダ3</h3>
<h4>ヘッダ4</h4>
<h5>ヘッダ5</h5>
</div>
</div>
2015/30/10
2015/08/01
2015/02/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/01/13
文字クラス:[](ブラケット)
• 日付書式をなるべく厳格に特定する
32
2015/30/10
2015/08/01
2015/02/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/01/13
検索 [0-9][0-9][0-9][0-9]/[01][0-9]/[0-3][0-9]
文字クラス:[^](否定のブラケット)
• 否定のブラケットは[^]の中に含めた文字のいず
れかと一致しない文字を表現するメタ文字です
• 否定を意味する「^」は必ず先頭に記述する必
要があります(2文字以降に記述した場合、通
常の文字クラスになります)
• ハイフン(-)を使うことで文字の範囲を表現す
ることが可能です(ブラケットと同じ)
33
文字クラス:[^](否定のブラケット)
• 先頭が数字でない行を特定する
34
02:37:34.940 [main] (Pleiades) Pleiad
02:37:34.940 [main] (Pleiades) Eclips
02:37:35.247 [main] (PropertySet) sto
org.osgi.framework.BundleException: バ
at org.eclipse.osgi.framework.
at org.eclipse.osgi.framework.
02:37:35.248 [main] (LauncherTransfor
02:37:34.940 [main] (Pleiades) Pleiad
02:37:34.940 [main] (Pleiades) Eclips
02:37:35.247 [main] (PropertySet) sto
org.osgi.framework.BundleException: バ
at org.eclipse.osgi.framework.
at org.eclipse.osgi.framework.
02:37:35.248 [main] (LauncherTransfor
検索 ^[^0-9]
2015/30/10
2015/08/01
2015/02/22
2015/19/01
2015/08/40
^
2015/47/10
文字クラス:[^](否定のブラケット)
• 「^」は必ず先頭に記述すること
35
2015/30/10
2015/08/01
2015/02/22
2015/19/01
2015/08/40
^
2015/47/10
検索 [0-9^]
エスケープ文字
• 特殊な文字を表現するエスケープ文字があります
36
メタ文字 意味
. ドットそのもの。量指定子(後述)が存在するため
r キャリッジリターン(CR)。Mac OSの改行コード
n ラインフィード(LF)。UNIXの改行コード
rn CR+LF。Windowsの改行コード(rとnを組み合わせただけ)
t タブ文字
d [0-9]
D [^0-9]
s 空白、タブ文字、改行
S 空白、タブ文字、改行以外
i [A-Za-z_]
c [A-Za-z_0-9]
エスケープ文字
37
2015/30/10
2015/08/01
2015/02/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/01/13
• 日付書式をなるべく厳格に特定する2
2015/30/10
2015/08/01
2015/02/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/01/13
検索 dddd/[01]d/[0-3]d
量指定子
• 付加することで文字に対して「反復機能」を得ることが可能です
38
量指定子 意味
?
ひとつ前の文字の存在を1回のみ許容する
→ 任意の1個(0または1)
*
ひとつ前の文字の存在を0回以上、無限に許容する
→ 任意の0個以上(無限)
+
ひとつ前の文字の存在を1回以上、無限に許容する
→ 任意の1個以上(無限)
{N}、{f,t}
数字一つを指定した場合、一つ文字の存在をN回のみ許容す
る
ひとつ前の文字の存在をf回以上、t回まで許容する
→任意のf個以上(t個まで)
量指定子:?(疑問符)
• 存在が不定な文字を考慮したマッチング(某DBのツールは、
行が選択できない場合、selectedの後ろに「.」が付かない)
39
21 rows selected.
no rows selected
37 rows selected.
no rows selected
64 rows selected.
60 rows selected.
15 rows selected.
21 rows selected.
no rows selected
37 rows selected.
no rows selected
64 rows selected.
60 rows selected.
15 rows selected.
検索 selected.?$
名前,取扱支店,...
S名N子,近畿支店,...
Jヶ崎M嘉,関東支店,...
M方A海,東北支店,...
O石I,中部支店,...
M川Mく,近畿支店,...
T時A梨,東北支店,...
H口Aやめ,近畿支店,...
量指定子:*(アスタリスク)
• CSV形式で先頭カラムを削除する(カラムに値
が設定されているとは限らない)
40
属性,名前,取扱支店,...
cu,S名N子,近畿支店,...
,Jヶ崎M嘉,関東支店,...
co,M方A海,東北支店,...
co,O石I,中部支店,...
,M川Mく,近畿支店,...
,T時A梨,東北支店,...
pa,H口Aやめ,近畿支店,...
検索 ^[^,]*,
置換
量指定子:+(プラス記号)
• なにかしらかの値が必ず設定されている行を特定する
41
属性,名前,取扱支店,...
!
cu,Jヶ崎M嘉,関東支店,...
!
co,O石I,中部支店,...
pa,M川Mく,近畿支店,...
!
pa,H口Aやめ,近畿支店,...
属性,名前,取扱支店,...
!
cu,Jヶ崎M嘉,関東支店,...
!
co,O石I,中部支店,...
pa,M川Mく,近畿支店,...
!
pa,H口Aやめ,近畿支店,...
検索 ^.+$
量指定子:{N}
42
2015/30/10
2015/08/01
2015/2/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/1/13
• 日付書式をなるべく厳格に特定する3
2015/30/10
2015/08/01
2015/2/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/1/13
検索 d{4}/[01]?d/[0-3]?d$
量指定子:{f,t}
43
2015/30/10
2015/08/01
2015/2/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/1/13
• 日付書式を特定する4(厳格ではない)
2015/30/10
2015/08/01
2015/2/22
2015/19/01
2015/08/40
2015/11/11
2015/47/10
2015/11/12
2015/12/32
2015/1/13
検索 d{4}/d{1,2}/d{1,2}$
または:|(パイプ)
• パイプ記号はパイプ前後の文字列にマッチし
ます
• プログラムのORと同じような動きと考えて問
題ありません
• パイプ記号はメモリが許す限りいくらでも連
結できます
ああああ|いいいい|うううう|ええええ
44
名前,星座
S名N子,天 座
I十嵐K子,獅子座
M方A海,獅子座
M川Mく,魚座
F居T,蟹座
O石I,蠍座
Y口M羽,蟹座
Jヶ崎M嘉,蠍座
T時A梨,射手座
H口Aやめ,山羊座
または:|(パイプ)
45
• 海のいきものの星座を持つ行を特定する
名前,星座
S名N子,天 座
I十嵐K子,獅子座
M方A海,獅子座
M川Mく,魚座
F居T,蟹座
O石I,蠍座
Y口M羽,蟹座
Jヶ崎M嘉,蠍座
T時A梨,射手座
H口Aやめ,山羊座
検索 魚座¦蟹座
グルーピング:()(カッコ)
• カッコでメタ文字、リテラル文字をくくるこ
とによりグループ化が可能です
• 量指定子、パイプ記号などと組み合わせるこ
とで、より複雑なパターンをつくることが可
能です
46
名前,星座
S名N子,天 座
I十嵐K子,獅子座
M方A海,獅子座
!
!
O石I,蠍座
!
Jヶ崎M嘉,蠍座
T時A梨,射手座
H口Aやめ,山羊座
グルーピング:()(カッコ)
47
• 海のいきものの星座を持つ行を削除する
名前,星座
S名N子,天 座
I十嵐K子,獅子座
M方A海,獅子座
M川Mく,魚座
F居T,蟹座
O石I,蠍座
Y口M羽,蟹座
Jヶ崎M嘉,蠍座
T時A梨,射手座
H口Aやめ,山羊座
検索 ^[^,]*,(魚座¦蟹座)$
置換
名前,星座
!
!
!
M川Mく,魚座
F居T,蟹座
!
Y口M羽,蟹座
!
!
グルーピング:()(カッコ)
48
• 海のいきものの星座を持たない行を削除する(書いてから思った、これ否定のブラケット
でした)
名前,星座
S名N子,天 座
I十嵐K子,獅子座
M方A海,獅子座
M川Mく,魚座
F居T,蟹座
O石I,蠍座
Y口M羽,蟹座
Jヶ崎M嘉,蠍座
T時A梨,射手座
H口Aやめ,山羊座
検索 ^[^,]*,[^魚蟹星]+座$
置換
キャプチャと後方参照:()、n
• グルーピングした文字列をそれ以降で参照(後方参
照)することが出来ます。この場合、グルーピング
の事をキャプチャと呼んだりします
• 後方参照する場合に使用するメタ文字は
1、2、3、.....、n
のようにキャプチャ番号(カッコの順番)+数
字で参照します
• また、0は特殊な後方参照で、マッチしたものすべ
てを表現します
49
キャプチャと後方参照:()、n
50
• 名前、取扱支店、発注回数、住所の順番を発
注回数、取扱支店、住所、名前に入れ替える
名前,取扱支店,発注回数,住所
S名N子,近畿支店,21,530-0001 大阪府 ●●…
I十嵐K子,中国支店,59,680-0001 鳥取県 ●●…
Y口M羽,関東支店,14,千葉県 ▲▲…
Jヶ崎M嘉,関東支店,43,330-0002 埼玉県 ▲▲…
M方A海,東北支店,37,030-001 青森県 ●●…
F居T,近畿支店,64,滋賀県 ■■…
O石I,中部支店,60,410-0001 静岡県 ■■…
M川Mく,近畿支店,88,530-0002 大阪府 ●●…
T時A梨,東北支店,84,010-00001 秋田県 ▲▲…
H口Aやめ,近畿支店,15,三重県 ▲▲…
【置換前】
キャプチャと後方参照:()、n
51
検索 ^([^,]+),([^,]+),([^,]+),([^,n]+)$
置換 3,2,4,1
1 2 3 4
発注回数,取扱支店,住所,名前
21,近畿支店,530-0001 大阪府 ●●…,S名N子
59,中国支店,680-0001 鳥取県 ●●…,I十嵐K子
14,関東支店,千葉県 ▲▲…,Y口M羽
43,関東支店,330-0002 埼玉県 ▲▲…,Jヶ崎M嘉
37,東北支店,030-001 青森県 ●●…,M方A海
64,近畿支店,滋賀県 ■■…,F居T
60,中部支店,410-0001 静岡県 ■■…,O石I
88,近畿支店,530-0002 大阪府 ●●…,M川Mく
84,東北支店,010-00001 秋田県 ▲▲…,T時A梨
15,近畿支店,三重県 ▲▲…,H口Aやめ
【置換後】
キャプチャと後方参照:()、n
52
発注回数,取扱支店,住所,名前,元は→,名前,取扱支店,発注回数,住所
21,近畿支店,530-0001 大阪府 ●●…,S名N子,元は→,S名N子,近畿支店,21,530-0001 大阪府 ●●…
59,中国支店,680-0001 鳥取県 ●●…,I十嵐K子,元は→,I十嵐K子,中国支店,59,680-0001 鳥取県 ●●…
14,関東支店,千葉県 ▲▲…,Y口M羽,元は→,Y口M羽,関東支店,14,千葉県 ▲▲…
43,関東支店,330-0002 埼玉県 ▲▲…,Jヶ崎M嘉,元は→,Jヶ崎M嘉,関東支店,43,330-0002 埼玉県 ▲▲…
37,東北支店,030-001 青森県 ●●…,M方A海,元は→,M方A海,東北支店,37,030-001 青森県 ●●…
64,近畿支店,滋賀県 ■■…,F居T,元は→,F居T,近畿支店,64,滋賀県 ■■…
60,中部支店,410-0001 静岡県 ■■…,O石I,元は→,O石I,中部支店,60,410-0001 静岡県 ■■…
88,近畿支店,530-0002 大阪府 ●●…,M川Mく,元は→,M川Mく,近畿支店,88,530-0002 大阪府 ●●…
84,東北支店,010-00001 秋田県 ▲▲…,T時A梨,元は→,T時A梨,東北支店,84,010-00001 秋田県 ▲▲…
15,近畿支店,三重県 ▲▲…,H口Aやめ,元は→,H口Aやめ,近畿支店,15,三重県 ▲▲…
【置換後】
検索 ^([^,]+),([^,]+),([^,]+),([^,n]+)$
置換 3,2,4,1,元は→,0
1 2 3 4
0
• 順番を入れ替えつつ、元のレコードは後方に残す
キャプチャと後方参照:()、n
53
• ファイルを一括でリネームするコマンドを作る
WS000017.JPG
WS000016.JPG
WS000015.JPG
WS000014.JPG
…
rename WS000017.JPG WS000017.JPG.bk
rename WS000016.JPG WS000016.JPG.bk
rename WS000015.JPG WS000015.JPG.bk
rename WS000014.JPG WS000014.JPG.bk
…
検索 ^S+$
置換 rename 0 0.bk
キャプチャと後方参照:()、n
54
• 置換ばかりで後方参照していますが、検索でも後方参照は可能です
• 同じ数字が11桁連続している不正データを探す
00000000000
12231981273
08496242754
11111111111
88888888888
13259385065
33358501999
61904013958
12329310847
00000000000
12231981273
08496242754
11111111111
88888888888
13259385065
33358501999
61904013958
12329310847
検索 ^(d)1{10}$
ものぐさマッチ:量指定子+?
• 正規表現の量指定子はとても勤勉なの該当す
る最長のマッチ結果を返却します。量指定子
に「?」を付与することで、最小のマッチ結果
を返却するようになります
• これをものぐさマッチ(非よくばりマッチな
どなど)と呼びます
• 勤勉マッチは強欲マッチと呼んだりも
55
ものぐさマッチ:量指定子?
• (強欲|ものぐさ)マッチの範囲を比べる
56
属性,名前,取扱支店,...
cu,S名N子,近畿支店,...
pa,Jヶ崎M嘉,関東支店,...
co,M方A海,東北支店,...
co,O石I,中部支店,...
cu,M川Mく,近畿支店,...
pa,T時A梨,東北支店,...
pa,H口Aやめ,近畿支店,...
【強欲】
検索 ^.+,
【ものぐさ】
検索 ^.+?,
属性,名前,取扱支店,...
cu,S名N子,近畿支店,...
pa,Jヶ崎M嘉,関東支店,...
co,M方A海,東北支店,...
co,O石I,中部支店,...
cu,M川Mく,近畿支店,...
pa,T時A梨,東北支店,...
pa,H口Aやめ,近畿支店,...
正規表現のコツ
• 法則性を見つけること
検索対象から法則性を見つけよう(カンマで区
切られてる?数字で構成されている?等)
• 不用意なマッチに気をつける
^と$を入れない事によるバグは多いです。例えば
YYYYMMDD_Hoge.log
を「d{8}_Hoge.log」でマッチさせたら大丈夫?
57
正規表現のコツ
• 普段から正規表現を使うようにする
当たり前ですが、使わないと覚えません。本テキス
トの内容を駆使すれば、効率は通常の3倍になるで
しょう(MS-06S感)
• 損益分岐点を考えて使う
なんでも正規表現で解決するのは得策ではありませ
ん。日付マッチで感じたと思いますが、日付の完璧
な妥当性を正規表現でマッチさせようとしたら大変
ですよ
58
正規表現のコツ
• Windows+テキストエディタのユーザを対象と
しましたが、UNIX、Linuxコマンドが るよう
になったはずです
1. $ tar zOxvf hoge.tar.gz | grep -c -E '[^,]{3},
[0-9]{3}-[0-9]{4}'
→ 最初の例に類似した結果を取得
2. ls | grep '^[^.]*.log$'
→ 純粋なログファイル一覧を取得
59
最初のサンプルについて
• 最初のサンプルで使ったメタ文字は、本テキストに
は載せていません。ぜひともググってみて下さい
60
(?<=^([^,]*,){3})(?!
d{3}-d{4}[^d])
※赤字部分は本テキストに乗せていません
おしまい
author:suwork
初版:2015/06/13
改定:2015/10/04
61
引用/参考資料
・オライリー・ジャパン 詳説 正規表現 第3版
・IM@S CG DB(http://imas.cg.db.n-hokke.com/)
・大塚チルド食品 スゴイダイズ(http://www.otsuka-chilled.co.jp/product/diz/)
・アイドルマスターシンデレラガールズ(mobage)内より画像を拝借(怒られたら消します)

More Related Content

What's hot

幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜
幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜
幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜SFDG ROOKIES
 
「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介
「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介
「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介ricksoftKK
 
Big Data Architectural Patterns and Best Practices
Big Data Architectural Patterns and Best PracticesBig Data Architectural Patterns and Best Practices
Big Data Architectural Patterns and Best PracticesAmazon Web Services
 
Efficient Data Formats for Analytics with Parquet and Arrow
Efficient Data Formats for Analytics with Parquet and ArrowEfficient Data Formats for Analytics with Parquet and Arrow
Efficient Data Formats for Analytics with Parquet and ArrowDataWorks Summit/Hadoop Summit
 
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイントドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント増田 亨
 
Construindo a NuConta
Construindo a NuContaConstruindo a NuConta
Construindo a NuContaNubank
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
Değer akışı haritalama, value stream mapping
Değer akışı haritalama, value stream mappingDeğer akışı haritalama, value stream mapping
Değer akışı haritalama, value stream mappingTUBITAK
 
営業チームの案件管理をConfluenceでやってみた
営業チームの案件管理をConfluenceでやってみた営業チームの案件管理をConfluenceでやってみた
営業チームの案件管理をConfluenceでやってみたKinzen Nanbara
 
BigQuery勉強会 Standard SQL Dialect
BigQuery勉強会 Standard SQL DialectBigQuery勉強会 Standard SQL Dialect
BigQuery勉強会 Standard SQL DialectKen Morishita
 
クラウド時代のデータストア選択"秘伝の書"
クラウド時代のデータストア選択"秘伝の書"クラウド時代のデータストア選択"秘伝の書"
クラウド時代のデータストア選択"秘伝の書"Hiromasa Oka
 
アジャイル開発やってみた
アジャイル開発やってみたアジャイル開発やってみた
アジャイル開発やってみたArata Fujimura
 
Building real time analytics applications using pinot : A LinkedIn case study
Building real time analytics applications using pinot : A LinkedIn case studyBuilding real time analytics applications using pinot : A LinkedIn case study
Building real time analytics applications using pinot : A LinkedIn case studyKishore Gopalakrishna
 
明治大学理工学部 特別講義 AI on Azure
明治大学理工学部 特別講義 AI on Azure明治大学理工学部 特別講義 AI on Azure
明治大学理工学部 特別講義 AI on AzureDaiyu Hatakeyama
 
『逆転オセロニア』における運用効率化支援 〜デッキログのデータマイニング〜
『逆転オセロニア』における運用効率化支援  〜デッキログのデータマイニング〜『逆転オセロニア』における運用効率化支援  〜デッキログのデータマイニング〜
『逆転オセロニア』における運用効率化支援 〜デッキログのデータマイニング〜DeNA
 
Discover How Volvo Cars Uses a Time Series Database to Become Data-Driven
Discover How Volvo Cars Uses a Time Series Database to Become Data-DrivenDiscover How Volvo Cars Uses a Time Series Database to Become Data-Driven
Discover How Volvo Cars Uses a Time Series Database to Become Data-DrivenDevOps.com
 
Kafka Retry and DLQ
Kafka Retry and DLQKafka Retry and DLQ
Kafka Retry and DLQGeorge Teo
 
楽天技術研究所の次世代AI 技術への挑戦
楽天技術研究所の次世代AI 技術への挑戦楽天技術研究所の次世代AI 技術への挑戦
楽天技術研究所の次世代AI 技術への挑戦Rakuten Group, Inc.
 

What's hot (20)

幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜
幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜
幅広い技術力が身につくSalesforceエンジニアのススメ〜入門編〜
 
「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介
「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介
「Redmine」、「Trac」から「Atlassian JIRA」への移行紹介
 
Big Data Architectural Patterns and Best Practices
Big Data Architectural Patterns and Best PracticesBig Data Architectural Patterns and Best Practices
Big Data Architectural Patterns and Best Practices
 
Efficient Data Formats for Analytics with Parquet and Arrow
Efficient Data Formats for Analytics with Parquet and ArrowEfficient Data Formats for Analytics with Parquet and Arrow
Efficient Data Formats for Analytics with Parquet and Arrow
 
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイントドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント
 
Construindo a NuConta
Construindo a NuContaConstruindo a NuConta
Construindo a NuConta
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
Değer akışı haritalama, value stream mapping
Değer akışı haritalama, value stream mappingDeğer akışı haritalama, value stream mapping
Değer akışı haritalama, value stream mapping
 
営業チームの案件管理をConfluenceでやってみた
営業チームの案件管理をConfluenceでやってみた営業チームの案件管理をConfluenceでやってみた
営業チームの案件管理をConfluenceでやってみた
 
Designing data intensive applications
Designing data intensive applicationsDesigning data intensive applications
Designing data intensive applications
 
BigQuery勉強会 Standard SQL Dialect
BigQuery勉強会 Standard SQL DialectBigQuery勉強会 Standard SQL Dialect
BigQuery勉強会 Standard SQL Dialect
 
クラウド時代のデータストア選択"秘伝の書"
クラウド時代のデータストア選択"秘伝の書"クラウド時代のデータストア選択"秘伝の書"
クラウド時代のデータストア選択"秘伝の書"
 
アジャイル開発やってみた
アジャイル開発やってみたアジャイル開発やってみた
アジャイル開発やってみた
 
Building real time analytics applications using pinot : A LinkedIn case study
Building real time analytics applications using pinot : A LinkedIn case studyBuilding real time analytics applications using pinot : A LinkedIn case study
Building real time analytics applications using pinot : A LinkedIn case study
 
明治大学理工学部 特別講義 AI on Azure
明治大学理工学部 特別講義 AI on Azure明治大学理工学部 特別講義 AI on Azure
明治大学理工学部 特別講義 AI on Azure
 
『逆転オセロニア』における運用効率化支援 〜デッキログのデータマイニング〜
『逆転オセロニア』における運用効率化支援  〜デッキログのデータマイニング〜『逆転オセロニア』における運用効率化支援  〜デッキログのデータマイニング〜
『逆転オセロニア』における運用効率化支援 〜デッキログのデータマイニング〜
 
Discover How Volvo Cars Uses a Time Series Database to Become Data-Driven
Discover How Volvo Cars Uses a Time Series Database to Become Data-DrivenDiscover How Volvo Cars Uses a Time Series Database to Become Data-Driven
Discover How Volvo Cars Uses a Time Series Database to Become Data-Driven
 
Kafka Retry and DLQ
Kafka Retry and DLQKafka Retry and DLQ
Kafka Retry and DLQ
 
Big Data Architectural Patterns
Big Data Architectural PatternsBig Data Architectural Patterns
Big Data Architectural Patterns
 
楽天技術研究所の次世代AI 技術への挑戦
楽天技術研究所の次世代AI 技術への挑戦楽天技術研究所の次世代AI 技術への挑戦
楽天技術研究所の次世代AI 技術への挑戦
 

Viewers also liked

AIS Program Brochure with Samples
AIS Program Brochure with SamplesAIS Program Brochure with Samples
AIS Program Brochure with SamplesNolan Teng
 
Бизнес-планирование (часть 1 Резюме)
Бизнес-планирование (часть 1 Резюме)Бизнес-планирование (часть 1 Резюме)
Бизнес-планирование (часть 1 Резюме)Софья Митрошина
 
Крашенинникова О.В. кейс "Анализ данных"
Крашенинникова О.В. кейс "Анализ данных"Крашенинникова О.В. кейс "Анализ данных"
Крашенинникова О.В. кейс "Анализ данных"Ольга Крашенинникова
 
Сводка поступивших предложений по уведомлению о начале разработки законопроек...
Сводка поступивших предложений по уведомлению о начале разработки законопроек...Сводка поступивших предложений по уведомлению о начале разработки законопроек...
Сводка поступивших предложений по уведомлению о начале разработки законопроек...Artem Kozlyuk
 
Cómo generar y gestionar cultura investigativa en el proceso docente
Cómo generar y gestionar cultura investigativa en el proceso docenteCómo generar y gestionar cultura investigativa en el proceso docente
Cómo generar y gestionar cultura investigativa en el proceso docenteVladimir Estrada
 
говорова бумажная пластика
говорова бумажная пластикаговорова бумажная пластика
говорова бумажная пластикаЕлена Исакова
 
Ley de inmigración y colonización n°817
Ley de inmigración y colonización n°817Ley de inmigración y colonización n°817
Ley de inmigración y colonización n°817El Arcón de Clio
 

Viewers also liked (16)

Topic12 optical fiber
Topic12 optical fiberTopic12 optical fiber
Topic12 optical fiber
 
Topic14 lan
Topic14 lanTopic14 lan
Topic14 lan
 
Topic17 frame relay
Topic17 frame relayTopic17 frame relay
Topic17 frame relay
 
Topic10 coaxial
Topic10 coaxialTopic10 coaxial
Topic10 coaxial
 
AIS Program Brochure with Samples
AIS Program Brochure with SamplesAIS Program Brochure with Samples
AIS Program Brochure with Samples
 
Бизнес-планирование (часть 1 Резюме)
Бизнес-планирование (часть 1 Резюме)Бизнес-планирование (часть 1 Резюме)
Бизнес-планирование (часть 1 Резюме)
 
Крашенинникова О.В. кейс "Анализ данных"
Крашенинникова О.В. кейс "Анализ данных"Крашенинникова О.В. кейс "Анализ данных"
Крашенинникова О.В. кейс "Анализ данных"
 
Durban Port Operators Awarded
Durban Port Operators AwardedDurban Port Operators Awarded
Durban Port Operators Awarded
 
Сводка поступивших предложений по уведомлению о начале разработки законопроек...
Сводка поступивших предложений по уведомлению о начале разработки законопроек...Сводка поступивших предложений по уведомлению о начале разработки законопроек...
Сводка поступивших предложений по уведомлению о начале разработки законопроек...
 
медиа проект
медиа проектмедиа проект
медиа проект
 
Cómo generar y gestionar cultura investigativa en el proceso docente
Cómo generar y gestionar cultura investigativa en el proceso docenteCómo generar y gestionar cultura investigativa en el proceso docente
Cómo generar y gestionar cultura investigativa en el proceso docente
 
бумажная пластика зоря
бумажная пластика зорябумажная пластика зоря
бумажная пластика зоря
 
говорова бумажная пластика
говорова бумажная пластикаговорова бумажная пластика
говорова бумажная пластика
 
па лит. 8 класс
па лит. 8 класспа лит. 8 класс
па лит. 8 класс
 
Ekz
EkzEkz
Ekz
 
Ley de inmigración y colonización n°817
Ley de inmigración y colonización n°817Ley de inmigración y colonización n°817
Ley de inmigración y colonización n°817
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Recently uploaded (10)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

はじめての正規表現(一般公開版)