Slide 1

Slide 1 text

YouTube Live (2020.07.23 Thur. 22:00~)

Slide 2

Slide 2 text

配信を見終えた時 これがスッと頭に入ってくる! …はず (?-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}))?))\ ])))

Slide 3

Slide 3 text

配信を見終えた時 これがスッと頭に入ってくる! …はず (?-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}))?))\ ]))) 冗談です

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

話す人 現役のエンジニア二人 赤貝が好きな CTO と デザイン勉強中のエンジニア @mu_vpoe 最近は SwiftUI で macOS アプリづくりが 趣味 ムー zaru @zaru CTO, Love 赤貝, JavaScript, Firebase, Web Components. Twitter フォロー お願いします!

Slide 6

Slide 6 text

話す事とゴール 話す事 - 正規表現とは? - 基本的な使い方 - 複雑な条件を表現してみる ゴール - 正規表現が怖くない - 日常的に正規表現を使える 話さない事 - 完璧正確な正規表現 - パフォーマンス

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

文字列の集合を zaru zaku zatu zayu za と u の間に1文字入る文字列の 集合を、正規表現で表現している za.u 文字列の集合 ドットが記法 特定の記法で表現 za9u

Slide 10

Slide 10 text

文字列の集合を zaru zaku zatu zayu /za.u/ 文字列の集合 特定の記法で表現 za9u コードで使う場合は、 このデリミタと呼ばれる スラッシュで囲む

Slide 11

Slide 11 text

集合を表現できると 判定・検索・置換が簡単 zaru zaku zatu zayu if ( ) 判定 I'm zaru. 置換 zaku I'm mu. mu I'm zaru. zaku 検索 Hit!

Slide 12

Slide 12 text

小ネタ 英語では Regular Expression プログラミングでは、省略して Regex や Regexp という名前で使います。 発音はレゲックス(という人が多い気がします)

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

. は、任意の1字にマッチする za.u 1文字だったら何でも良い zaru , zaku , za9u , za@u (改行コード以外) マッチする例 ドット saru , maru, zau マッチしない例

Slide 16

Slide 16 text

* は、前にある文字が 0 文字以上続く zaru* * の前の u が0文字以上 アスタリスク zaru , zaruu , zar マッチする例 za マッチしない例

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

. と * + は組み合わせ可能 zaru.+ . でどんな文字も OK + でどんな文字でも1文字以上 正規表現は記法の組み合わせで 色んな文字列を表現していく

Slide 21

Slide 21 text

小ネタ /za.u/ デリミタ

Slide 22

Slide 22 text

読みにくい デリミタは / スラッシュから変えられる 小ネタ 例えば URL にマッチする正規表現は、↓のように http:// の スラッシュがデリミタと被るので \ でエスケープ が必要 /http:\/\/www/ エスケープ #http://www# 別の記号にすれば エスケープ が必要ない 言語によって違います。デリミタがない言語もあります。JS は変更できません。 スッキリ ☺

Slide 23

Slide 23 text

[ ] は、中にある文字、いずれかにマッチする [abc] [ ] の中の a か b か c にマッチ ブラケット a , book , cat マッチする例 d , egg , 999 マッチしない例

Slide 24

Slide 24 text

[ ] は、- で中の文字を範囲指定できる [a-z] a から z までの英字 a , b , c ... y , z ブラケット マッチする例 ハイフン [0-9] 0 から 9 までの数字 0 , 1 ... 8 , 9 マッチする例

Slide 25

Slide 25 text

{n} は、前にある文字が n 文字続く a{4} a が4個続く xaaaab ブレース aaa マッチする例 マッチしない例

Slide 26

Slide 26 text

{n,m} は、前にある文字が n 文字以上 , m 文字以下 続く a{4,6} a が4個以上、6個以下続く 0aaaab , aaaaaa ブレース a , aa , aaa マッチする例 マッチしない例

Slide 27

Slide 27 text

携帯電話の番号にマッチする正規表現を作る 最初の3桁は 070 , 080 , 090 のいずれか 問題 070-0000-0000 , 080-8888-8888 , 090-1234-5678 マッチする例

Slide 28

Slide 28 text

携帯電話の番号にマッチする正規表現を作る 最初の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つ続く

Slide 29

Slide 29 text

携帯電話の番号にマッチする正規表現を作る 最初の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} 別解

Slide 30

Slide 30 text

[ ] に、^ で中の文字含まない指定ができる [^a-z] a から z までの英字を含まない ブラケット キャレット [ ] に、- を指定したい場合は末尾か先頭に ブラケット ハイフン [a-z-] これは範囲指定用のハイフン これは文字としてのハイフン

Slide 31

Slide 31 text

^ は行頭を $ は行末を表す ^My name is [a-z]+$ M から始まる文字列 ドル キャレット a から z までの文字で終わる My name is zaru I'm zaru , My name is zaru9 マッチする例 マッチしない例 ^ と $ の代わりに \A と \z を使う方が改行があった場合に完全一致できる

Slide 32

Slide 32 text

メールアドレスの正規表現 (?-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 準拠のメールアドレスを正規表現でチェックするのは非現実 的、簡易なチェックに留めて実際にメールが届くかどうかで判断し た方が良い。

Slide 33

Slide 33 text

絵文字や平仮名・カタカナもマッチできる 小ネタ \p{Hiragana} バックスラッシュ + p で、文字種のパターンを指定できる \p{Katakana} \p{Han} カタカナ 漢字 \p{Emoji} 絵文字 これらは Unicode property という文字に定義されている種類データに基づいて判定される。 使う場合は事前にどんな文字がマッチするかを調べた方が良い。 例えば、 ー (音引き)は、Katakana-Hiragana という両方に所属しており \p{Hiragana} だとヒットしない。 /\p{Emoji}/u コードで使う場合は、デリミタの後ろに Unicode オプションを付ける必要がある

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

$1 は記録したものを置換で使える ID: ([a-z]+) ドル @$1 ID: zaru 置換する例 @zaru

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

(?= ) は、直後に囲んだ文字列が ある場合にマッチする mu-(?=zaru) mu- の後に zaru が続く mu- にマッチする mu-zaru , mu-zaru-channel mu-zaku , muzaru マッチする例 マッチしない例

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

(?=xxx) 直後に指定した文字列がある場合にマッチする(肯定先読み) (?!xxx) 直後に指定した文字列がない場合にマッチする(否定先読み) (?<=xxx) 直前に指定した文字列がある場合にマッチする(肯定後読み) (?

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

$user を $customer に置換する ただし、$userList はそのままにする 問題 $user = 'zaru'; $userList = ['mu', 'zaru']; 置換する文字列 $customer = 'zaru'; $userList = ['mu', 'zaru']; \$user(?!List) $customer 検索の正規表現 置換

Slide 47

Slide 47 text

\$user(?!List) 改善してみる \$user(?!\w+) \$user(?![a-zA-Z0-9]+) これだと $userData にはマッチしてしまう 文字列ではなく、正規表現も使える $user の直後に英数字が 続かない場合にマッチする

Slide 48

Slide 48 text

ありがとうございました! 次回は... VSCode または Vim をやります!木曜21時から30分 質問感想など呟いていただけると嬉しいです! - ハッシュタグ #mu_zaru - ツイッター情報 @mu_vpoe チャンネル登録 Good ボタン お願いします! ムーザルちゃんねる