Slide 1

Slide 1 text

正規表現勉強会

Slide 2

Slide 2 text

今日の目的 1. まず正規表現のありがたさを知るべし! 2. ゼロから一緒にハンズオンをしよう!

Slide 3

Slide 3 text

デモ

Slide 4

Slide 4 text

はじめに

Slide 5

Slide 5 text

正規表現とは? 検索 (⌘+F) の進化系のようなものです 置換にも使えます

Slide 6

Slide 6 text

普通の検索 普通の検索は完全一致。

Slide 7

Slide 7 text

正規表現で検索 いろんな文字を同時にマッチできます。

Slide 8

Slide 8 text

置換 一括で置換できます。

Slide 9

Slide 9 text

準備 VSCode でやります ⌘+F で検索窓を開こう ↓の通りにボタンを押す

Slide 10

Slide 10 text

記法

Slide 11

Slide 11 text

完全一致 正規表現でも、普通の検索と同じように完全一致 できます。

Slide 12

Slide 12 text

完全一致 ワード Script は、2箇所でマッチ。

Slide 13

Slide 13 text

. → 任意の文字 検索文字 . は、あらゆる1文字にマッチ。 文字 a で置換するとこうなる。 aaaaaaaaaaaaaaaaaaaaaaaaaa

Slide 14

Slide 14 text

. → 任意の文字 検索ワード ....Script は、JavaScript と TypeScript の両方にマッチ。

Slide 15

Slide 15 text

^ → 行頭 検索文字 ^ は、行頭にマッチ。 検索ワードが行頭に来たケースのみをマッチで きる。

Slide 16

Slide 16 text

^ → 行頭 TypeScript は行頭に来てないので ^Type はマッ チしない!

Slide 17

Slide 17 text

$ → 行末 検索文字 $ は、行末にマッチ。

Slide 18

Slide 18 text

[…] → どれか1文字 文字 a, b, c にマッチ。

Slide 19

Slide 19 text

[…] → どれか1文字 無理やり数字にマッチさせるとこう。

Slide 20

Slide 20 text

[…] → どれか1文字 ハイフンでまとめて指定できます。(小文字)

Slide 21

Slide 21 text

[…] → どれか1文字 ハイフンでまとめて指定できます。(大文字)

Slide 22

Slide 22 text

[…] → どれか1文字 ハイフンでまとめて指定できます。(数字)

Slide 23

Slide 23 text

[^…] → どれでもない1文字 逆に指定した文字のうち どれでもない1文字 に マッチもできます。 ↓例は 数字以外 の文字にマッチ

Slide 24

Slide 24 text

+ → 繰り返し + 直前の文字の繰り返しにマッチ ↓例は a の後に b が1回以上続くケースにマッ チ

Slide 25

Slide 25 text

* → 繰り返し * は + と同じく、直前の文字の繰り返しにマッ チ * は + と異なり0回 (ないこと) にもマッチする

Slide 26

Slide 26 text

* → 繰り返し 文字 a の間に「b が0回ある」という事実にマ ッチしている… ※これが正規表現の理解が難しい所 ↓ (置換) _a_a_a_

Slide 27

Slide 27 text

(…)+ → ワードの繰り返し グループ (...) を使えば、ワードの繰り返しにもマ ッチできます。

Slide 28

Slide 28 text

(…|…) → ワードのOR グループ (...|...) を使えば、複数ワードのどれかに マッチできます。

Slide 29

Slide 29 text

エスケープ

Slide 30

Slide 30 text

特殊記号はエスケープが必要 前述した特殊記号は abc の様に普通にマッチは できない。 \ を使ってエスケープをすると文字としてマッチ できる。 . → \. ^ → \^ $ → \$ [ → \[ ] → \] + → \+ * → \* ( → \( ) → \) | → \|

Slide 31

Slide 31 text

特殊記号はエスケープが必要 それか [...] を使う技もある。 この中では ], - 以外はエススケープが不要。 [.^$+*()|]

Slide 32

Slide 32 text

置換

Slide 33

Slide 33 text

普通の置換

Slide 34

Slide 34 text

普通の置換

Slide 35

Slide 35 text

奥義! キャプチャグループ! Taro, Hanako, Mike にマッチする正規表現 [A- Za-z]+ が丸括弧で囲まれています

Slide 36

Slide 36 text

奥義! キャプチャグループ! 置換後の文字列では $1 がそれぞれ Taro, Hanako, Mike に置き換わりました 丸括弧が複数ある場合は順に、 $1, $2, $3 … で参照します

Slide 37

Slide 37 text

なぜ $1 なのか? \1 は? VSCode は という JavaScript Framework で作られています → VSCode の正規表現の仕様は Electron JavaScript 標準

Slide 38

Slide 38 text

先・後読みは説明しないが… 次の様に書いて置換すると、マッチしない行を まとめて消せる ので便利 ^(?!.*残したいワード).*\n

Slide 39

Slide 39 text

その他、ツール類

Slide 40

Slide 40 text

HTTPS://REGEX101.COM/

Slide 41

Slide 41 text

CHATGPT

Slide 42

Slide 42 text

演習

Slide 43

Slide 43 text

探す 1. 次のアクセスログからエラーログ (4XX) を正規 表現でマッチさせよう 2. エラーログ (4XX, 5XX) の両方をマッチさせよう 3. (Want・難) 4XX, 5XX にマッチだけにフィルタ [info] 2023-03-15 10:15:30 - GET /some/path - 200 OK - 123ms [error] 2023-03-20 08:20:15 - GET /no/such/path - 404 Not Foun [error] 2023-03-20 12:00:03 - POST /some/path - 500 Internal S [error] 2023-03-21 23:55:55 - GET /some/path - 401 Anauthorize

Slide 44

Slide 44 text

消す 末尾の秒数(ms)だけを残して、手前は消してみよ う ↓ (置換) [info] 2023-03-15 10:15:30 - GET /some/path - 200 OK - 123ms [error] 2023-03-20 08:20:15 - GET /no/such/path - 404 Not Foun [error] 2023-03-20 12:00:03 - POST /some/path - 500 Internal S [error] 2023-03-21 23:55:55 - GET /some/path - 401 Anauthorize 123ms 456ms 111ms 10ms

Slide 45

Slide 45 text

一部だけ抜き出す 次の文字列はWebアプリケーションのログで す。DockerのJSONログ形式で出力されていま す。 "log" JSONキーが示す値のみを抜き出して見ま しょう。 (json unescape は不要) ↓ (置換) { "log": "[info] 2023-03-15 10:15:30 - GET /some/path - 200 OK { "log": "[error] 2023-03-20 08:20:15 - GET /no/such/path - 40 [info] 2023-03-15 10:15:30 - GET /some/path - 200 OK - 123ms [error] 2023-03-20 08:20:15 - GET /no/such/path - 404 Not Foun

Slide 46

Slide 46 text

一部だけ抜き出す (前ページからの続きです) CSV形式に整形しましょう。表示順は 日時 → log_level → 本文 の順です。 ↓ (置換) [info] 2023-03-15 10:15:30 - GET /some/path - 200 OK - 123ms [error] 2023-03-20 08:20:15 - GET /no/such/path - 404 Not Foun 2023-03-15 10:15:30,info,GET /some/path - 200 OK - 123ms 2023-03-20 08:20:15,error,GET /no/such/path - 404 Not Found -

Slide 47

Slide 47 text

END

Slide 48

Slide 48 text

No content