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

正規表現 / RegExp_2021

正規表現 / RegExp_2021

Cybozu
PRO

June 02, 2021
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

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

    View Slide

  2. 名前とは︖
    ▌全てをリストアップしようとしたら
    切りがない
    ▌「何でも良い」というわけにもい
    かない
    ▌(なるべく)全てを表現するパ
    ターンを使う

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 特別クラス
    ▌¥d 数字 →[0-9]
    ▌¥D ⾮数字 →[^0-9]
    ▌¥w ⽂字(数字を含む) →[a-zA-Z0-9_]
    ▌¥W ⾮⽂字 →[^a-zA-Z0-9_]

    View Slide

  8. 基本な正規表現: 繰り返し
    ▌? 0-1回繰り返しマッチする
    ▌+ 1回以上繰り返しマッチする
    ▌* 0回以上繰り返しマッチする
    ▌{min, max} min回以上、max回以下
    n 例).+¥.cybozu(-dev)?.com
    n ocean.cybozu-dev.com
    n hoge.cybozu.com
    n example.com/www.cybozu.com ←あれ︖

    View Slide

  9. 名前とは︖
    ▌[A-Z][a-z]*
    ▌本当︖
    ▌「Taro Jr.」 は︖
    ▌正規表現って難しい

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. メールアドレスとは︖
    ▌ (?:[a-z0-9!#$%&'*+¥/=?^_`{|}~-]+(?:¥.[a-
    z0-9!#$%&'*+¥/=?^_`{|}~-]+)*|"(?:[¥x01-
    ¥x08¥x0b¥x0c¥x0e-¥x1f¥x21¥x23-
    ¥x5b¥x5d-¥x7f]|¥¥[¥x01-
    ¥x09¥x0b¥x0c¥x0e-¥x7f])*")@(?:(?:[a-
    z0-9](?:[a-z0-9-]*[a-z0-9])?¥.)+[a-z0-
    9](?:[a-z0-9-]*[a-z0-9])?|¥[(?:(?:(2(5[0-
    5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-
    9]))¥.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-
    9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-
    9]:(?:[¥x01-¥x08¥x0b¥x0c¥x0e-¥x1f¥x21-
    ¥x5a¥x53-¥x7f]|¥¥[¥x01-
    ¥x09¥x0b¥x0c¥x0e-¥x7f])+)¥])
    ▌ 正規表現って難しい

    View Slide

  14. ツール紹介
    業務で恐らく使う事になる場⾯

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. git-grep
    ▌https://git-scm.com/docs/git-grep
    ▌gitレポにあるファイルをgrepする
    ▌例) git grep -B1 -E "IN¥W+SPF"

    View Slide

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

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

    View Slide

  21. 演習
    ▌https://regexcrossword.com/ で遊ぶ
    ▌↓の出⼒からHTTPヘッダーを抽出する
    n curl -v https://hoge.cybozu-dev.com

    View Slide