Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

会社の研修で使った正規表現のテキストです。正規表現ってなに?使ったことない!という方にオススメです。

  • Login to see the comments

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

  1. 1. はじめての正規表現 ∼仕事を楽しくするエッセンシャル∼ author:@suwork 1
  2. 2. 本テキストの対象者 • 正規表現ってなに?とのピュアな人 • テキストエディタで検索ウィンドウを開いたと きに「正規表現」にチェックが入っていない人 • サクラエディタ、秀丸エディタなどのWindows のテキストエディタを扱う人(※) ※テキスト内でWindowsに対応したテキストエディタを用います (正規表現とWindowsは関係ありません) 2
  3. 3. テキストに入る前に…… • 本テキストはWindows7マシン+iCloud keynote(beta) で作成しています • テンプレートは「Azusa Colors」を利用しています。あ りがとうございます(http://memo.sanographix.net/ post/113681262780) • 本テキストが完成する30分前に、iCloudが変な同期を 行い、keyファイルが壊れました(復元不可)。……こ れは思い出して書き直したのだよ 3
  4. 4. 正規表現ってなに? • 正規表現は、強力で柔軟、かつ効率的なテキ スト処理の を握る存在だ。 4 • さまざまな用途に対応できる能 力と表現力を持った一般的なパ ターン言語が発達してきた。 (略)このパターン言語とパ ターン自体を正規表現と呼ぶ。 オライリー・ジャパン 詳説 正規表現 第3版 より抜粋
  5. 5. 結局、正規表現ってなに? • かの偉い人は言いました 5 • ……若干意味を取り違えている気がします が、手を動かして試していきましょう プログラマーの格言34(盗作多し) 目で追う暇があるなら動かせ。脳細胞よりもCPUの ほうが解析が速い。そして、その間、休める。 出典:プログラマーの格言(盗作多し)(http://www2.biglobe.ne.jp/oni_page/other/etc/pr03.html)より
  6. 6. このテキストに必要なもの テキストエディタ 6 みんな大好きサクラエディタでいいよ! #僕は秀丸を使うね!
  7. 7. テキストエディタの設定 • 検索ウィンドウの正規表現にチェックを入れ るべし 7
  8. 8. 正規表現ってなに? Part2 • こんなことがありました 8 上司「郵便番号と住所を一つの項目で管理しているウェブシステムが、 今度のシステム開発で郵便番号と住所を別項目で管理するようになるん だよね。それで住所項目から郵便番号を導出して移行する必要があるん だけど、現状の住所項目の登録内容を見ると郵便番号が入っていたり、 入っているけど書式が正しくなかったりしていて、どれくらい工数が必要 か検討がつかないんだよね。80万行くらいのCSVファイルなんだけど、 ざっくりでいいから郵便番号がちゃんと設定されていないレコード数を 教えてくれる?完璧な結果は必要はないけど、精度が高いと嬉しい。CSV ファイルはサーバに圧縮して置いてあるから。なるべく早めに欲しいな あ(意訳:早くよこせ)」 僕「アッハイ」
  9. 9. 正規表現ってなに? Part2 • 長い、長いけどひとまず整理をすると…… 1. 80万行くらいのCSVファイルの 2. 住所項目に郵便番号が設定されていないレ コードを探す 3. 精度は高いほうが良い 4. 早めに欲しい 9
  10. 10. 正規表現ってなに? 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,時代劇鑑賞、忍者グッズ収 集、撮影所巡り
  11. 11. 正規表現ってなに? Part2 • さあ、こんな時はどうやって探そう? 11 1. CSVならExcelが得意!Excelに貼り付けてどうにかしよ う → 80万行のファイルを!やりたくない 2. 簡単なスクリプトでも作るか…… → 精度を求めているので、バグは厳禁(自信があるならどうぞ) 3. 俺の目に任せろ(目視で件数を数える) → その根性は別のタイミングにとっておいて下さい
  12. 12. 正規表現ってなに? Part2 • 冷静になってレコードを見てみると、法則が あります 12 1. CSV(カンマ区切り)との法則 2. 郵便番号(3桁数字+ハイフン+4桁数 字)との法則 • このようにある程度の法則がある場合、「正規表 現」が有用です
  13. 13. 正規表現ってなに? Part2 • 以下の文字列を設定して検索してみよう 13 (?<=^([^,]*,){3})(?! d{3}-d{4}[^d]) ※「」は「¥」の半角
  14. 14. 正規表現ってなに? Part2 • すごい、それっぽいレコードが取得できた!(スマン、秀丸だけの方言が 入ってるかも知れない) 14 そもそも郵便番号を入力していないレコード 入力しているが書式を誤っているレコード
  15. 15. 正規表現ってなに? Part2 15 これはスゴイ(大 豆ではない) ※スゴイダイズは大塚チルド食品株式会社の製品です
  16. 16. 正規表現ってなに? Part2 • スゴイだけで終わってはいけません。検索に 使った文字列の意味は……? 16 (?<=^([^,]*,){3})(?!d{3}-d{4}[^d]) 郵便番号の書式が存在し ないことを表現 先頭から3番目のカンマ 区切りの位置取りを表現 + =先頭から3番目のカンマ区切りの後ろに、郵便番号が 存在しないレコードを検索対象とする、としているのだ
  17. 17. 正規表現ってなに? Part2 • 「としているのだ」と宣言されても、複雑怪 奇な文字列でなぜ検索できるのだろう? • この複雑怪奇な文字列の塊がまさに「正規 表現」なのである 17
  18. 18. 正規表現ってなに? Part2 • 黄色文字は位置であったり、文字であったり、その繰り返し等を定 義したりする文字 「メタ文字」と呼びます • 紫色文字は文字そのもの 「リテラル文字」と呼びます • 正規表現は、メタ文字とリテラル文字の組み合わせで強力な文 字列パターンを表現することが可能 18 (?<=^([^,]*,){3})(?!d{3}-d{4}[^d])
  19. 19. 正規表現ってなに? Part2 • 正規表現はメタ文字の使いっぷりですべてが 決まります(良くも悪くも) • むしろメタ文字を制するもの正規表現を制す と言って過言ではない。メタ文字の仕様(役 割)を理解しよう • 次のページから基本的な正規表現を学んでい きましょう! 19
  20. 20. 位置を表現:^(ハット記号) • 文字列にはマッチせず、文字列の先頭を表現 する特殊なメタ文字です • ハット記号単体で先頭に文字を挿入したい場 合やリテラル文字と組み合わせて、先頭文字 に対してxxしたいなどの時によく使います 20 ※正式名称
  21. 21. 位置を表現:^(ハット記号) • 先頭に文字を入力してコマンドを作る 21 WS000017.JPG WS000016.JPG WS000015.JPG WS000014.JPG … del WS000017.JPG del WS000016.JPG del WS000015.JPG del WS000014.JPG … 検索 ^ 置換 del△
  22. 22. 位置を表現:^(ハット記号) • 特定のレコードから始まる行だけを消す 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. 23. 位置を表現:$(ドル記号) • 文字列にはマッチせず、文字列の末尾を表現 する特殊なメタ文字です • ハット記号は先頭ですが、ドル記号は末尾を 表します。ドル記号単体で末尾に何か文字を 入れたり、リテラル文字と組み合わせて末尾 の文字列を特定したりすることが可能です 23
  24. 24. 位置を表現:$(ドル記号) • (こんな使い方はしないと思いますが)末尾に文字列を追加する 24 ブラックニッカスペシャル ブラックニッカ 8年 ブラックニッカ クリア フロム・ザ・バレル スーパーニッカ 鶴 17年 オールモルト 検索 $ 置換 を購入する ブラックニッカスペシャルを購入する ブラックニッカ 8年を購入する ブラックニッカ クリアを購入する フロム・ザ・バレルを購入する スーパーニッカを購入する 鶴 17年を購入する オールモルトを購入する
  25. 25. 位置を表現:$(ドル記号) • 末尾の更新年月だけを消す(作成月は残す) 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
  26. 26. 位置を表現:^ $ • ハット記号とドル記号は組み合わせで絶大な パワーを発揮します。例えばファイル名が 「suwork」であること正規表現で調べようと すると…… 26 検索文字 判定結果 理由 suwork sssuworkkkで検索できてしまう ^suwork suworkkkで検索できてしまう suwork$ sssuworkで検索できてしまう ^suwork$ ○ 先頭がsでuworと続き、末尾がkであ ることを保証
  27. 27. 単一の文字とマッチ:.(ドット) • ドット記号は何かの文字にマッチするメタ文 字です • 後述する量指定子と組み合わせることで、 マッチの幅が広がります 27
  28. 28. 単一の文字とマッチ:.(ドット) • 誕生日が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. 29. 文字クラス:[](ブラケット) • ブラケットは[]の中に含めた文字のいずれかと一致す るメタ文字です • ハイフン(-)を使うことで文字の範囲を表現すること が可能です 29 検索文字 マッチする文字 [a-z] abcdefghijklmnopqrstuvwxyz のいずれか [A-Z] ABCDEFGHIJKLMNOPQRSTUVWXYZ のいずれか [0-9] 0123456789 のいずれか [a-zA-Z0-9] abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 のいずれか
  30. 30. 文字クラス:[](ブラケット) • 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>
  31. 31. 文字クラス:[](ブラケット) • 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>
  32. 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 文字クラス:[](ブラケット) • 日付書式をなるべく厳格に特定する 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]
  33. 33. 文字クラス:[^](否定のブラケット) • 否定のブラケットは[^]の中に含めた文字のいず れかと一致しない文字を表現するメタ文字です • 否定を意味する「^」は必ず先頭に記述する必 要があります(2文字以降に記述した場合、通 常の文字クラスになります) • ハイフン(-)を使うことで文字の範囲を表現す ることが可能です(ブラケットと同じ) 33
  34. 34. 文字クラス:[^](否定のブラケット) • 先頭が数字でない行を特定する 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]
  35. 35. 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. 36. エスケープ文字 • 特殊な文字を表現するエスケープ文字があります 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. 37. エスケープ文字 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. 38. 量指定子 • 付加することで文字に対して「反復機能」を得ることが可能です 38 量指定子 意味 ? ひとつ前の文字の存在を1回のみ許容する → 任意の1個(0または1) * ひとつ前の文字の存在を0回以上、無限に許容する → 任意の0個以上(無限) + ひとつ前の文字の存在を1回以上、無限に許容する → 任意の1個以上(無限) {N}、{f,t} 数字一つを指定した場合、一つ文字の存在をN回のみ許容す る ひとつ前の文字の存在をf回以上、t回まで許容する →任意のf個以上(t個まで)
  39. 39. 量指定子:?(疑問符) • 存在が不定な文字を考慮したマッチング(某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.?$
  40. 40. 名前,取扱支店,... 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. 41. 量指定子:+(プラス記号) • なにかしらかの値が必ず設定されている行を特定する 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やめ,近畿支店,... 検索 ^.+$
  42. 42. 量指定子:{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$
  43. 43. 量指定子:{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}$
  44. 44. または:|(パイプ) • パイプ記号はパイプ前後の文字列にマッチし ます • プログラムのORと同じような動きと考えて問 題ありません • パイプ記号はメモリが許す限りいくらでも連 結できます ああああ|いいいい|うううう|ええええ 44
  45. 45. 名前,星座 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. 46. グルーピング:()(カッコ) • カッコでメタ文字、リテラル文字をくくるこ とによりグループ化が可能です • 量指定子、パイプ記号などと組み合わせるこ とで、より複雑なパターンをつくることが可 能です 46
  47. 47. 名前,星座 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やめ,山羊座 検索 ^[^,]*,(魚座¦蟹座)$ 置換
  48. 48. 名前,星座 ! ! ! 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やめ,山羊座 検索 ^[^,]*,[^魚蟹星]+座$ 置換
  49. 49. キャプチャと後方参照:()、n • グルーピングした文字列をそれ以降で参照(後方参 照)することが出来ます。この場合、グルーピング の事をキャプチャと呼んだりします • 後方参照する場合に使用するメタ文字は 1、2、3、.....、n のようにキャプチャ番号(カッコの順番)+数 字で参照します • また、0は特殊な後方参照で、マッチしたものすべ てを表現します 49
  50. 50. キャプチャと後方参照:()、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,三重県 ▲▲… 【置換前】
  51. 51. キャプチャと後方参照:()、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やめ 【置換後】
  52. 52. キャプチャと後方参照:()、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 • 順番を入れ替えつつ、元のレコードは後方に残す
  53. 53. キャプチャと後方参照:()、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
  54. 54. キャプチャと後方参照:()、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. 55. ものぐさマッチ:量指定子+? • 正規表現の量指定子はとても勤勉なの該当す る最長のマッチ結果を返却します。量指定子 に「?」を付与することで、最小のマッチ結果 を返却するようになります • これをものぐさマッチ(非よくばりマッチな どなど)と呼びます • 勤勉マッチは強欲マッチと呼んだりも 55
  56. 56. ものぐさマッチ:量指定子? • (強欲|ものぐさ)マッチの範囲を比べる 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やめ,近畿支店,...
  57. 57. 正規表現のコツ • 法則性を見つけること 検索対象から法則性を見つけよう(カンマで区 切られてる?数字で構成されている?等) • 不用意なマッチに気をつける ^と$を入れない事によるバグは多いです。例えば YYYYMMDD_Hoge.log を「d{8}_Hoge.log」でマッチさせたら大丈夫? 57
  58. 58. 正規表現のコツ • 普段から正規表現を使うようにする 当たり前ですが、使わないと覚えません。本テキス トの内容を駆使すれば、効率は通常の3倍になるで しょう(MS-06S感) • 損益分岐点を考えて使う なんでも正規表現で解決するのは得策ではありませ ん。日付マッチで感じたと思いますが、日付の完璧 な妥当性を正規表現でマッチさせようとしたら大変 ですよ 58
  59. 59. 正規表現のコツ • 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. 60. 最初のサンプルについて • 最初のサンプルで使ったメタ文字は、本テキストに は載せていません。ぜひともググってみて下さい 60 (?<=^([^,]*,){3})(?! d{3}-d{4}[^d]) ※赤字部分は本テキストに乗せていません
  61. 61. おしまい 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)内より画像を拝借(怒られたら消します)

×