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

知ってると役に立つ正規表現

mu_zaru
July 30, 2020

 知ってると役に立つ正規表現

配信動画はこちら
https://www.youtube.com/watch?v=T7Y2kfMm7kk

もし良かったらムーザルちゃんねるのチャンネル登録お願いします!
https://www.youtube.com/channel/UCLPHXwLp90A5R69Eltxo-sg

Twitter でもプログラミングネタをつぶやいているのでフォローお待ちしております。
ムー
https://twitter.com/mu_vpoe
zaru
https://twitter.com/zaru

mu_zaru

July 30, 2020
Tweet

More Decks by mu_zaru

Other Decks in Programming

Transcript

  1. 話す人 現役のエンジニア二人 赤貝が好きな CTO と デザイン勉強中のエンジニア @mu_vpoe 最近は SwiftUI で

    macOS アプリづくりが 趣味 ムー zaru @zaru CTO, Love 赤貝, JavaScript, Firebase, Web Components. Twitter フォロー お願いします!
  2. 話す事とゴール 話す事 - 正規表現とは? - 基本的な使い方 - 複雑な条件を表現してみる ゴール -

    正規表現が怖くない - 日常的に正規表現を使える 話さない事 - 完璧正確な正規表現 - パフォーマンス
  3. . は、任意の1字にマッチする za.u 1文字だったら何でも良い zaru , zaku , za9u ,

    za@u (改行コード以外) マッチする例 ドット saru , maru, zau マッチしない例
  4. + は、前にある文字が 1 文字以上続く zaru+ + の前の u が1文字以上 プラス

    zaruu , zaruuu , zaruuuu マッチする例 zaru , maruu マッチしない例
  5. . と * + は組み合わせ可能 zaru.+ . でどんな文字も OK +

    でどんな文字でも1文字以上 正規表現は記法の組み合わせで 色んな文字列を表現していく
  6. 読みにくい デリミタは / スラッシュから変えられる 小ネタ 例えば URL にマッチする正規表現は、↓のように http:// の

    スラッシュがデリミタと被るので \ でエスケープ が必要 /http:\/\/www/ エスケープ #http://www# 別の記号にすれば エスケープ が必要ない 言語によって違います。デリミタがない言語もあります。JS は変更できません。 スッキリ ☺
  7. [ ] は、中にある文字、いずれかにマッチする [abc] [ ] の中の a か b

    か c にマッチ ブラケット a , book , cat マッチする例 d , egg , 999 マッチしない例
  8. [ ] は、- で中の文字を範囲指定できる [a-z] a から z までの英字 a

    , b , c ... y , z ブラケット マッチする例 ハイフン [0-9] 0 から 9 までの数字 0 , 1 ... 8 , 9 マッチする例
  9. {n,m} は、前にある文字が n 文字以上 , m 文字以下 続く a{4,6} a

    が4個以上、6個以下続く 0aaaab , aaaaaa ブレース a , aa , aaa マッチする例 マッチしない例
  10. 携帯電話の番号にマッチする正規表現を作る 最初の3桁は 070 , 080 , 090 のいずれか 解答 070-0000-0000

    , 080-8888-8888 , 090-1234-5678 マッチする例 0[7-9]0-[0-9]{4}-[0-9]{4} 答え 7 8 9 の範囲にマッチ このハイフンは文字のハイフン 0から9の数字が4つ続く
  11. 携帯電話の番号にマッチする正規表現を作る 最初の3桁は 070 , 080 , 090 のいずれか 解答 070-0000-0000

    , 080-8888-8888 , 090-1234-5678 マッチする例 0[7-9]0-\d{4}-\d{4} 答え [0-9] は \d で表現できる 0[7-9]0-[0-9]{4}-[0-9]{4} 別解
  12. [ ] に、^ で中の文字含まない指定ができる [^a-z] a から z までの英字を含まない ブラケット

    キャレット [ ] に、- を指定したい場合は末尾か先頭に ブラケット ハイフン [a-z-] これは範囲指定用のハイフン これは文字としてのハイフン
  13. ^ は行頭を $ は行末を表す ^My name is [a-z]+$ M から始まる文字列

    ドル キャレット a から z までの文字で終わる My name is zaru I'm zaru , My name is zaru9 マッチする例 マッチしない例 ^ と $ の代わりに \A と \z を使う方が改行があった場合に完全一致できる
  14. 絵文字や平仮名・カタカナもマッチできる 小ネタ \p{Hiragana} バックスラッシュ + p で、文字種のパターンを指定できる \p{Katakana} \p{Han} カタカナ

    漢字 \p{Emoji} 絵文字 これらは Unicode property という文字に定義されている種類データに基づいて判定される。 使う場合は事前にどんな文字がマッチするかを調べた方が良い。 例えば、 ー (音引き)は、Katakana-Hiragana という両方に所属しており \p{Hiragana} だとヒットしない。 /\p{Emoji}/u コードで使う場合は、デリミタの後ろに Unicode オプションを付ける必要がある
  15. $user を $customer に置換する ただし、$userList はそのままにする 問題 $user = 'zaru';

    $userList = ['mu', 'zaru']; 置換する文字列 $customer = 'zaru'; $userList = ['mu', 'zaru'];
  16. (?= ) は、直後に囲んだ文字列が ある場合にマッチする mu-(?=zaru) mu- の後に zaru が続く mu-

    にマッチする mu-zaru , mu-zaru-channel mu-zaku , muzaru マッチする例 マッチしない例
  17. mu-(?=zaru) mu- の後に zaru が続く mu- にマッチする mu-zaru , mu-zaru-channel

    mu-zaku , muzaru マッチする例 マッチしない例 (?= ) は、直後に囲んだ文字列が ある場合にマッチする lookahead 先読み (?= ) 検索対象の先の文字を条件に
  18. mu-(?=zaru) mu-zaru mu-(?!zaru) mu-zaru (?<=mu)-zaru mu-zaru (?<!mu)-zaru zaru-zaru mu-mu mu-zaru

    mu-mu zaru-zaru 先読み 後読み < があると後読み・前の文字を参照する ! は否定の意味になる
  19. $user を $customer に置換する ただし、$userList はそのままにする 問題 $user = 'zaru';

    $userList = ['mu', 'zaru']; 置換する文字列 $customer = 'zaru'; $userList = ['mu', 'zaru'];
  20. $user を $customer に置換する ただし、$userList はそのままにする 問題 $user = 'zaru';

    $userList = ['mu', 'zaru']; 置換する文字列 $customer = 'zaru'; $userList = ['mu', 'zaru']; \$user(?!List) $customer 検索の正規表現 置換