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
Regexp_2020
Search
Cybozu
PRO
August 19, 2020
Technology
0
58k
Regexp_2020
Cybozu
PRO
August 19, 2020
Tweet
Share
More Decks by Cybozu
See All by Cybozu
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
9
43k
テクニカルライティング
cybozuinsideout
PRO
4
230
サイボウズのアジャイルクオリティ2024
cybozuinsideout
PRO
3
200
モブに早く慣れたい人のためのガイド2024
cybozuinsideout
PRO
3
260
モバイル
cybozuinsideout
PRO
3
150
ソフトウェアライセンス
cybozuinsideout
PRO
4
130
ソフトウェアテスト
cybozuinsideout
PRO
3
210
自動テスト
cybozuinsideout
PRO
3
210
Docker入門2024
cybozuinsideout
PRO
3
360
Other Decks in Technology
See All in Technology
Mackerelが取り組むオブザーバビリティ - Mackerel Tech Day
mackerelio
0
330
Apple/Google/Amazonの決済システムの違いを踏まえた定期購読課金システムの構築 / abema-billing-system
cyberagentdevelopers
PRO
1
190
わたしとトラックポイント / TrackPoint tips
masahirokawahara
1
200
Railway Oriented Programming を オニオンアーキテクチャに適用する by kotlin-result / Railway Oriented Programming in Onion Architecture by kotlin-result
yuitosato
2
210
新R25、乃木坂46 Mobileなどのファンビジネスを支えるマルチテナンシーなプラットフォームの全体像 / cam-multi-cloud
cyberagentdevelopers
PRO
1
110
Vueで Webコンポーネントを作って Reactで使う / 20241030-cloudsign-vuefes_after_night
bengo4com
3
180
新卒1年目が向き合う生成AI事業の開発を加速させる技術選定 / ai-web-launcher
cyberagentdevelopers
PRO
3
840
Overview of file type identifiers
ange
0
210
ガバメントクラウド単独利用方式におけるIaC活用
techniczna
3
180
Sidekiq vs Solid Queue
willnet
11
7k
2024-10-30-reInventStandby_StudyGroup_Intro
shinichirokawano
1
230
Databricksで構築する初めての複合AIシステム - ML15min
taka_aki
2
1.3k
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
27
1.9k
Designing the Hi-DPI Web
ddemaree
280
34k
Gamification - CAS2011
davidbonilla
80
5k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.6k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Building Better People: How to give real-time feedback that sticks.
wjessup
363
19k
Why Our Code Smells
bkeepers
PRO
334
57k
Facilitating Awesome Meetings
lara
49
6k
[RailsConf 2023] Rails as a piece of cake
palkan
51
4.8k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Transcript
正規表現 サイボウズ株式会社
いきなりですが ▌問題︓あなたが今新しいChrome拡張を開発している。その拡張は、 cybozu.comのサブドメインからのみ使えるようにしたい。どうします︖ n (a) 全てのサブドメインをリストアップして個別にチェックを⼊れる n (b) *.cybozu.com でチェック⼊れる
n (c) /[a-zA-Z0-9_-]+.cybozu.com/ でチェックを⼊れる
(a) 全てのサブドメインをリストアップして個別にチェックを⼊れる ▌全てを表現することが⼤変、不可能な場合もある n hoge.cybozu.com だけ、みたいなケースだと適切 ▌新しいドメインを⼊れたい時更新が必要
(b) *.cybozu.com でチェック⼊れる ▌example.com/www.cybozu.com ▌はい、脆弱性 ▌Glob 表現
正規表現 (Regular Expressions) ▌⽂字列群を⼀つの⽂字列(パターン)でまとめて表現する ▌例)メールアドレス n
[email protected]
n hoge@サイボウズ.co.jp n
[email protected]
n (hoge)
[email protected]
n → RFC5321/RFC5322
正規表現の利⽤例 ▌バリデーション n ⼊⼒された⽂字列が期待通りの形式か n 例)メールアドレス欄に電話番号を⼊⼒していないか ▌抽出 n ⼤量のテキストデータから参照したい部分だけを抽出する n
例)アクセスログからIPアドレスだけを抽出するとか
基本な正規表現: ⽂字列 ▌連続する⽂字列 n 例)cybozu n cybozu.com n hoge.cybozu.com n
hoge.cybozu-dev.com
基本な正規表現: 選択・グループ ▌| 区切りでどれかにマッチさせる ▌() で選択範囲を限定する n 例)com|cn n cybozu.com
n cybozu.cn n (cybozu|kintone).com n cybozu.com n kintone.com n cybozu1com ←あれ︖
基本な正規表現 ▌. 1⽂字(何でも良い) ▌¥ ¥の次の特別⽂字をそのまま使う n 例)¥. 「.」という⽂字 ▌[ab] ⽂字クラス。[]の中の1⽂字をマッチする
▌[^ab] 否定⽂字クラス。[]の中が含まれなかったらマッチする ▌[a-z] aからzまでの⽂字クラス
特別クラス ▌¥d 数字 ▌¥D ⾮数字 ▌¥w ⽂字(数字を含む) ▌¥W ⾮⽂字
基本な正規表現: 繰り返し ▌? 0-1回繰り返しマッチする ▌+ 1回以上繰り返しマッチする ▌* 0回以上繰り返しマッチする ▌{min, max}
min回以上、max回以下 n 例).+¥.cybozu(-dev)?.com n hoge.cybozu-dev.com n hoge.cybozu.com n example.com/www.cybozu.com ←あれ︖
基本な正規表現:先頭と末尾 ▌^ ⾏の先頭にマッチ ▌$ ⾏の末尾にマッチ ▌^hoge.[a-z].com$ n hoge.cybozu.com n hoge.hoge.com
n nothoge.cybozu.com
演習:ここまでの正規表現を使う ▌全てのサイボウズサブドメインを表現しましょう n JP(cybozu.com), US(kintone.com), CN(cybozu.cn)も含む n 開発ドメイン(cybozu-dev.com, kintone-dev.com, …)も含む
n example.com(等) を含まない
後⽅参照 ▌¥1, ¥2, ¥n n番⽬の()内のマッチしたものと同じ⽂字列 ▌<(div|p)>.*<¥/¥1> n <div>hoge</div> n <p>hoge</p>
後⽅参照(2) ▌(?:hoge) マッチはするが、¥1には⼊らない ▌(?<name>hoge)(?P=name) 名前付き後⽅参照グループ
ツール紹介
awk ▌テキスト抽出⽤のプログラミング⾔語・コマンドラインツール ▌Aho, Weinberger, Kernighan ▌正規表現も使える ▌例)ip a s |
awk '/inet/{print $2}' n ip a s の結果に「inet」の含んだ⾏だけに対して2列⽬を抽出する
sed ▌Stream editor ▌ファイルを読み上げて書き換えられる ▌例) sed -i 's/2018/2019/g' kaiun.md ▌今年の資料を作るなら
sed -i 's/2019/2020/g' kaiun.md n kaiun.mdというファイルの中⾝から「2019」という⽂字を全て「2020」に する
grep ▌globally search a regular expression and print ▌全⽂検索してマッチした正規表現をプリントする ▌例)
grep -P "¥d+¥.¥d+¥.¥d+¥.¥d+" /var/log/nginx/error.log n nginxのエラーログからIPアドレスを表⽰する
git-grep ▌https://git-scm.com/docs/git-grep ▌例) git grep -B1 -E "IN¥W+SPF"
普段使っているツールにも ▌CLIでless等を使う場合、結果から正規表現で絞り込む事ができる ▌VSCodeの検索機能には正規表現を使った検索もできる ▌勿論プログラミング⾔語にも n https://github.com/cybozu-go/neco/blob/master/pkg/git- neco/cmd/github.go#L63 n https://github.com/kintone/kintone- cli/blob/master/src/utils/string.ts
お勧め ▌http://shop.oreilly.com/product/9780596003524.do ▌https://blog.cybozu.io/entry/8757 ▌https://regexcrossword.com/ ▌https://regex101.com/
演習 ▌https://regexcrossword.com/ で遊ぶ ▌↓の出⼒からHTTPヘッダーを抽出する n curl -v https://hoge.cybozu-dev.com ▌ログファイルからIPv4アドレスを抽出する n
https://github.com/elastic/examples/raw/master/Common%20Data%20Formats/nginx_logs/ngin x_logs n cat nginx_logs | … | sort --unique ▌地獄級︓RFC5321/RFC5322のメールアドレスをバリデートする正規表現 n できたら来年の正規表現講義の講師になるかも