Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Regexp_2020

Cybozu
PRO
August 19, 2020

 Regexp_2020

Cybozu
PRO

August 19, 2020
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

  1. 正規表現
    サイボウズ株式会社

    View Slide

  2. いきなりですが
    ▌問題︓あなたが今新しいChrome拡張を開発している。その拡張は、
    cybozu.comのサブドメインからのみ使えるようにしたい。どうします︖
    n (a) 全てのサブドメインをリストアップして個別にチェックを⼊れる
    n (b) *.cybozu.com でチェック⼊れる
    n (c) /[a-zA-Z0-9_-]+.cybozu.com/ でチェックを⼊れる

    View Slide

  3. (a) 全てのサブドメインをリストアップして個別にチェックを⼊れる
    ▌全てを表現することが⼤変、不可能な場合もある
    n hoge.cybozu.com だけ、みたいなケースだと適切
    ▌新しいドメインを⼊れたい時更新が必要

    View Slide

  4. (b) *.cybozu.com でチェック⼊れる
    ▌example.com/www.cybozu.com
    ▌はい、脆弱性
    ▌Glob 表現

    View Slide

  5. 正規表現 (Regular Expressions)
    ▌⽂字列群を⼀つの⽂字列(パターン)でまとめて表現する
    ▌例)メールアドレス
    n [email protected]
    n hoge@サイボウズ.co.jp
    n [email protected]
    n (hoge)[email protected]
    n → RFC5321/RFC5322

    View Slide

  6. 正規表現の利⽤例
    ▌バリデーション
    n ⼊⼒された⽂字列が期待通りの形式か
    n 例)メールアドレス欄に電話番号を⼊⼒していないか
    ▌抽出
    n ⼤量のテキストデータから参照したい部分だけを抽出する
    n 例)アクセスログからIPアドレスだけを抽出するとか

    View Slide

  7. 基本な正規表現: ⽂字列
    ▌連続する⽂字列
    n 例)cybozu
    n cybozu.com
    n hoge.cybozu.com
    n hoge.cybozu-dev.com

    View Slide

  8. 基本な正規表現: 選択・グループ
    ▌| 区切りでどれかにマッチさせる
    ▌() で選択範囲を限定する
    n 例)com|cn
    n cybozu.com
    n cybozu.cn
    n (cybozu|kintone).com
    n cybozu.com
    n kintone.com
    n cybozu1com ←あれ︖

    View Slide

  9. 基本な正規表現
    ▌. 1⽂字(何でも良い)
    ▌¥ ¥の次の特別⽂字をそのまま使う
    n 例)¥. 「.」という⽂字
    ▌[ab] ⽂字クラス。[]の中の1⽂字をマッチする
    ▌[^ab] 否定⽂字クラス。[]の中が含まれなかったらマッチする
    ▌[a-z] aからzまでの⽂字クラス

    View Slide

  10. 特別クラス
    ▌¥d 数字
    ▌¥D ⾮数字
    ▌¥w ⽂字(数字を含む)
    ▌¥W ⾮⽂字

    View Slide

  11. 基本な正規表現: 繰り返し
    ▌? 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 ←あれ︖

    View Slide

  12. 基本な正規表現:先頭と末尾
    ▌^ ⾏の先頭にマッチ
    ▌$ ⾏の末尾にマッチ
    ▌^hoge.[a-z].com$
    n hoge.cybozu.com
    n hoge.hoge.com
    n nothoge.cybozu.com

    View Slide

  13. 演習:ここまでの正規表現を使う
    ▌全てのサイボウズサブドメインを表現しましょう
    n JP(cybozu.com), US(kintone.com), CN(cybozu.cn)も含む
    n 開発ドメイン(cybozu-dev.com, kintone-dev.com, …)も含む
    n example.com(等) を含まない

    View Slide

  14. 後⽅参照
    ▌¥1, ¥2, ¥n n番⽬の()内のマッチしたものと同じ⽂字列
    ▌<(div|p)>.*<¥/¥1>
    n hoge
    n hoge

    View Slide

  15. 後⽅参照(2)
    ▌(?:hoge) マッチはするが、¥1には⼊らない
    ▌(?hoge)(?P=name) 名前付き後⽅参照グループ

    View Slide

  16. ツール紹介

    View Slide

  17. awk
    ▌テキスト抽出⽤のプログラミング⾔語・コマンドラインツール
    ▌Aho, Weinberger, Kernighan
    ▌正規表現も使える
    ▌例)ip a s | awk '/inet/{print $2}'
    n ip a s の結果に「inet」の含んだ⾏だけに対して2列⽬を抽出する

    View Slide

  18. sed
    ▌Stream editor
    ▌ファイルを読み上げて書き換えられる
    ▌例) sed -i 's/2018/2019/g' kaiun.md
    ▌今年の資料を作るなら sed -i 's/2019/2020/g' kaiun.md
    n kaiun.mdというファイルの中⾝から「2019」という⽂字を全て「2020」に
    する

    View Slide

  19. grep
    ▌globally search a regular expression and print
    ▌全⽂検索してマッチした正規表現をプリントする
    ▌例) grep -P "¥d+¥.¥d+¥.¥d+¥.¥d+" /var/log/nginx/error.log
    n nginxのエラーログからIPアドレスを表⽰する

    View Slide

  20. git-grep
    ▌https://git-scm.com/docs/git-grep
    ▌例) git grep -B1 -E "IN¥W+SPF"

    View Slide

  21. 普段使っているツールにも
    ▌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

    View Slide

  22. お勧め
    ▌http://shop.oreilly.com/product/9780596003524.do
    ▌https://blog.cybozu.io/entry/8757
    ▌https://regexcrossword.com/
    ▌https://regex101.com/

    View Slide

  23. 演習
    ▌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 できたら来年の正規表現講義の講師になるかも

    View Slide