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
51
正規表現勉強会(初歩)
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
260
Ruby メモリ管理 プログラミング
megmogmog1965
0
310
Other Decks in Programming
See All in Programming
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
testcontainers のススメ
sgash708
1
120
あれやってみてー駆動から成長を加速させる / areyattemite-driven
nashiusagi
1
200
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
1k
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
200
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
330
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
ソフトウェアの振る舞いに着目し 複雑な要件の開発に立ち向かう
rickyban
0
890
良いユニットテストを書こう
mototakatsu
4
1.8k
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
暇に任せてProxmoxコンソール 作ってみました
karugamo
1
720
命名をリントする
chiroruxx
1
380
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
66
4.5k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Git: the NoSQL Database
bkeepers
PRO
427
64k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Scaling GitHub
holman
458
140k
Practical Orchestrator
shlominoach
186
10k
Music & Morning Musume
bryan
46
6.2k
Mobile First: as difficult as doing things right
swwweet
222
9k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Site-Speed That Sticks
csswizardry
2
190
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
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