Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
正規表現勉強会(初歩)
Search
Yusuke Kawatsu
July 19, 2024
Programming
0
68
正規表現勉強会(初歩)
https://megmogmog1965.github.io/regex_slides/
Yusuke Kawatsu
July 19, 2024
Tweet
Share
More Decks by Yusuke Kawatsu
See All by Yusuke Kawatsu
日付と正規化
megmogmog1965
0
360
Ruby メモリ管理 プログラミング
megmogmog1965
0
570
Other Decks in Programming
See All in Programming
WindowInsetsだってテストしたい
ryunen344
1
160
カクヨムAndroidアプリのリブート
numeroanddev
0
420
Datadog RUM 本番導入までの道
shinter61
1
280
Select API from Kotlin Coroutine
jmatsu
1
140
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
360
複数アプリケーションを育てていくための共通化戦略
irof
10
3.9k
ASP.NETアプリケーションのモダナイズ インフラ編
tomokusaba
1
230
実はすごいスピードで進化しているCSS
hayato_yokoyama
0
110
生成AIで日々のエラー調査を進めたい
yuyaabo
0
570
TypeScript LSP の今までとこれから
quramy
1
500
C++20 射影変換
faithandbrave
0
460
単体テストの始め方/作り方
toms74209200
0
440
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Why Our Code Smells
bkeepers
PRO
337
57k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
123
52k
Thoughts on Productivity
jonyablonski
69
4.7k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Faster Mobile Websites
deanohume
307
31k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Optimizing for Happiness
mojombo
379
70k
Building Applications with DynamoDB
mza
95
6.4k
Transcript
正規表現勉強会
今日の目的 1. まず正規表現のありがたさを知るべし! 2. ゼロから一緒にハンズオンをしよう!
デモ
はじめに
正規表現とは? 検索 (⌘+F) の進化系のようなものです 置換にも使えます
普通の検索 普通の検索は完全一致。
正規表現で検索 いろんな文字を同時にマッチできます。
置換 一括で置換できます。
準備 VSCode でやります ⌘+F で検索窓を開こう ↓の通りにボタンを押す
記法
完全一致 正規表現でも、普通の検索と同じように完全一致 できます。
完全一致 ワード Script は、2箇所でマッチ。
. → 任意の文字 検索文字 . は、あらゆる1文字にマッチ。 文字 a で置換するとこうなる。 aaaaaaaaaaaaaaaaaaaaaaaaaa
. → 任意の文字 検索ワード ....Script は、JavaScript と TypeScript の両方にマッチ。
^ → 行頭 検索文字 ^ は、行頭にマッチ。 検索ワードが行頭に来たケースのみをマッチで きる。
^ → 行頭 TypeScript は行頭に来てないので ^Type はマッ チしない!
$ → 行末 検索文字 $ は、行末にマッチ。
[…] → どれか1文字 文字 a, b, c にマッチ。
[…] → どれか1文字 無理やり数字にマッチさせるとこう。
[…] → どれか1文字 ハイフンでまとめて指定できます。(小文字)
[…] → どれか1文字 ハイフンでまとめて指定できます。(大文字)
[…] → どれか1文字 ハイフンでまとめて指定できます。(数字)
[^…] → どれでもない1文字 逆に指定した文字のうち どれでもない1文字 に マッチもできます。 ↓例は 数字以外 の文字にマッチ
+ → 繰り返し + 直前の文字の繰り返しにマッチ ↓例は a の後に b が1回以上続くケースにマッ
チ
* → 繰り返し * は + と同じく、直前の文字の繰り返しにマッ チ * は
+ と異なり0回 (ないこと) にもマッチする
* → 繰り返し 文字 a の間に「b が0回ある」という事実にマ ッチしている… ※これが正規表現の理解が難しい所 ↓
(置換) _a_a_a_
(…)+ → ワードの繰り返し グループ (...) を使えば、ワードの繰り返しにもマ ッチできます。
(…|…) → ワードのOR グループ (...|...) を使えば、複数ワードのどれかに マッチできます。
エスケープ
特殊記号はエスケープが必要 前述した特殊記号は abc の様に普通にマッチは できない。 \ を使ってエスケープをすると文字としてマッチ できる。 . →
\. ^ → \^ $ → \$ [ → \[ ] → \] + → \+ * → \* ( → \( ) → \) | → \|
特殊記号はエスケープが必要 それか [...] を使う技もある。 この中では ], - 以外はエススケープが不要。 [.^$+*()|]
置換
普通の置換
普通の置換
奥義! キャプチャグループ! Taro, Hanako, Mike にマッチする正規表現 [A- Za-z]+ が丸括弧で囲まれています
奥義! キャプチャグループ! 置換後の文字列では $1 がそれぞれ Taro, Hanako, Mike に置き換わりました 丸括弧が複数ある場合は順に、
$1, $2, $3 … で参照します
なぜ $1 なのか? \1 は? VSCode は という JavaScript Framework
で作られています → VSCode の正規表現の仕様は Electron JavaScript 標準
先・後読みは説明しないが… 次の様に書いて置換すると、マッチしない行を まとめて消せる ので便利 ^(?!.*残したいワード).*\n
その他、ツール類
HTTPS://REGEX101.COM/
CHATGPT
演習
探す 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
消す 末尾の秒数(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
一部だけ抜き出す 次の文字列は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
一部だけ抜き出す (前ページからの続きです) 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 -
END
None