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

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

配信動画はこちら
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

C302e84057a922dce0ecbe80207e3fcc?s=128

mu_zaru

July 30, 2020
Tweet

Transcript

  1. YouTube Live (2020.07.23 Thur. 22:00~)

  2. 配信を見終えた時 これがスッと頭に入ってくる! …はず (?-mix:((?:(?:[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~]{1,64}(?:\.[ A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~]{1,62}){0,31})|"(?:[\x21\x 23-\x5B\x5D-\x7E]|\\[\x20-~]){0,62}"))@((?:(?:[A-Za-z0-9]( ?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.){0,127}[A-Za-z](?:[A- Za-z0-9-]{0,61}[A-Za-z0-9])?)|(?:\[(?:(?:[0-9]{1,3}(?:\.[0- 9]{1,3}){3})|(?:(?:[0-9A-Fa-f]{1,4})?(?:(?:::|:)(?:[0-9A-Fa-f ]{1,4})){1,7}(?:(?:::|:)(?:[0-9]{1,3}(?:\.[0-9]{1,3}){3}))?))\

    ])))
  3. 配信を見終えた時 これがスッと頭に入ってくる! …はず (?-mix:((?:(?:[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~]{1,64}(?:\.[ A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~]{1,62}){0,31})|"(?:[\x21\x 23-\x5B\x5D-\x7E]|\\[\x20-~]){0,62}"))@((?:(?:[A-Za-z0-9]( ?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.){0,127}[A-Za-z](?:[A- Za-z0-9-]{0,61}[A-Za-z0-9])?)|(?:\[(?:(?:[0-9]{1,3}(?:\.[0- 9]{1,3}){3})|(?:(?:[0-9A-Fa-f]{1,4})?(?:(?:::|:)(?:[0-9A-Fa-f ]{1,4})){1,7}(?:(?:::|:)(?:[0-9]{1,3}(?:\.[0-9]{1,3}){3}))?))\

    ]))) 冗談です
  4. 配信を見終えた時 これがスッと頭に入ってくる! …はず ^@[a-z0-9_]{1,15}$

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

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

    正規表現が怖くない - 日常的に正規表現を使える 話さない事 - 完璧正確な正規表現 - パフォーマンス
  7. 1. 正規表現とは 2. 基本的な使い方 3. ちょっと応用

  8. 1. 正規表現とは 2. 基本的な使い方 3. ちょっと応用

  9. 文字列の集合を zaru zaku zatu zayu za と u の間に1文字入る文字列の 集合を、正規表現で表現している

    za.u 文字列の集合 ドットが記法 特定の記法で表現 za9u
  10. 文字列の集合を zaru zaku zatu zayu /za.u/ 文字列の集合 特定の記法で表現 za9u コードで使う場合は、

    このデリミタと呼ばれる スラッシュで囲む
  11. 集合を表現できると 判定・検索・置換が簡単 zaru zaku zatu zayu if ( ) 判定

    I'm zaru. 置換 zaku I'm mu. mu I'm zaru. zaku 検索 Hit!
  12. 小ネタ 英語では Regular Expression プログラミングでは、省略して Regex や Regexp という名前で使います。 発音はレゲックス(という人が多い気がします)

  13. 1. 正規表現とは 2. 基本的な使い方 3. ちょっと応用

  14. 今回 紹介する基本的な正規表現 . + * [a-z] {3} {3,7} ^ $

  15. . は、任意の1字にマッチする za.u 1文字だったら何でも良い zaru , zaku , za9u ,

    za@u (改行コード以外) マッチする例 ドット saru , maru, zau マッチしない例
  16. * は、前にある文字が 0 文字以上続く zaru* * の前の u が0文字以上 アスタリスク

    zaru , zaruu , zar マッチする例 za マッチしない例
  17. + は、前にある文字が 1 文字以上続く zaru+ + の前の u が1文字以上 プラス

    zaruu , zaruuu , zaruuuu マッチする例 zaru , maruu マッチしない例
  18. zaru の最後にどんな文字でも、 1字以上続く文字列にマッチする正規表現を作る 問題 zarua , abczaru123, マッチする例 zari ,

    hoge , zaru マッチしない例
  19. zaru の最後にどんな文字でも、 1字以上続く文字列にマッチする正規表現を作る 解答 zaru.+ 答え zarua , abczaru123, マッチする例

  20. . と * + は組み合わせ可能 zaru.+ . でどんな文字も OK +

    でどんな文字でも1文字以上 正規表現は記法の組み合わせで 色んな文字列を表現していく
  21. 小ネタ /za.u/ デリミタ

  22. 読みにくい デリミタは / スラッシュから変えられる 小ネタ 例えば URL にマッチする正規表現は、↓のように http:// の

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

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

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

    マッチする例 マッチしない例
  26. {n,m} は、前にある文字が n 文字以上 , m 文字以下 続く a{4,6} a

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

    , 080-8888-8888 , 090-1234-5678 マッチする例
  28. 携帯電話の番号にマッチする正規表現を作る 最初の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つ続く
  29. 携帯電話の番号にマッチする正規表現を作る 最初の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} 別解
  30. [ ] に、^ で中の文字含まない指定ができる [^a-z] a から z までの英字を含まない ブラケット

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

    ドル キャレット a から z までの文字で終わる My name is zaru I'm zaru , My name is zaru9 マッチする例 マッチしない例 ^ と $ の代わりに \A と \z を使う方が改行があった場合に完全一致できる
  32. メールアドレスの正規表現 (?-mix:((?:(?:[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~]{1,64}(?:\.[ A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~]{1,62}){0,31})|"(?:[\x21\x 23-\x5B\x5D-\x7E]|\\[\x20-~]){0,62}"))@((?:(?:[A-Za-z0-9]( ?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.){0,127}[A-Za-z](?:[A- Za-z0-9-]{0,61}[A-Za-z0-9])?)|(?:\[(?:(?:[0-9]{1,3}(?:\.[0- 9]{1,3}){3})|(?:(?:[0-9A-Fa-f]{1,4})?(?:(?:::|:)(?:[0-9A-Fa-f ]{1,4})){1,7}(?:(?:::|:)(?:[0-9]{1,3}(?:\.[0-9]{1,3}){3}))?))\ ]))) 小ネタ

    RFC 準拠のメールアドレスを正規表現でチェックするのは非現実 的、簡易なチェックに留めて実際にメールが届くかどうかで判断し た方が良い。
  33. 絵文字や平仮名・カタカナもマッチできる 小ネタ \p{Hiragana} バックスラッシュ + p で、文字種のパターンを指定できる \p{Katakana} \p{Han} カタカナ

    漢字 \p{Emoji} 絵文字 これらは Unicode property という文字に定義されている種類データに基づいて判定される。 使う場合は事前にどんな文字がマッチするかを調べた方が良い。 例えば、 ー (音引き)は、Katakana-Hiragana という両方に所属しており \p{Hiragana} だとヒットしない。 /\p{Emoji}/u コードで使う場合は、デリミタの後ろに Unicode オプションを付ける必要がある
  34. 1. 正規表現とは 2. 基本的な使い方 3. ちょっと応用

  35. 今回 紹介するちょっと応用な正規表現 キャプチャ lookahead / lookbehind

  36. ( ) は、囲った正規表現に マッチした内容を記録する ID: ([a-z]+) a から z の文字が続く正規表現

    ID: zaru カッコ 例 zaru マッチした部分を記録
  37. $1 は記録したものを置換で使える ID: ([a-z]+) ドル @$1 ID: zaru 置換する例 @zaru

  38. エディタを使って以下のルールで置換 通貨の「円」を「¥」に置換する 問題 今は米ドル円が90円で円高だ 110円くらいになって欲しい 置換する文字列 今は米ドル円が¥90で円高だ ¥110くらいになって欲しい

  39. エディタを使って以下のルールで一発で置換 通貨の「円」を「¥」に置換する 解答 今は米ドル円が90円で円高だ 110円くらいになって欲しい 置換する文字列 今は米ドル円が¥90で円高だ ¥110くらいになって欲しい ([0-9]+)円 ¥$1

    検索の正規表現 置換
  40. $user を $customer に置換する ただし、$userList はそのままにする 問題 $user = 'zaru';

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

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

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

  44. mu-(?=zaru) mu-zaru mu-(?!zaru) mu-zaru (?<=mu)-zaru mu-zaru (?<!mu)-zaru zaru-zaru mu-mu mu-zaru

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

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

    $userList = ['mu', 'zaru']; 置換する文字列 $customer = 'zaru'; $userList = ['mu', 'zaru']; \$user(?!List) $customer 検索の正規表現 置換
  47. \$user(?!List) 改善してみる \$user(?!\w+) \$user(?![a-zA-Z0-9]+) これだと $userData にはマッチしてしまう 文字列ではなく、正規表現も使える $user の直後に英数字が

    続かない場合にマッチする
  48. ありがとうございました! 次回は... VSCode または Vim をやります!木曜21時から30分 質問感想など呟いていただけると嬉しいです! - ハッシュタグ #mu_zaru

    - ツイッター情報 @mu_vpoe チャンネル登録 Good ボタン お願いします! ムーザルちゃんねる