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

Swift Regex Builder

Swift Regex Builder

at Recap of WWDC22 https://mercari.connpass.com/event/248712/
2022/06/29 #wwdc_mercari

kumamotone

June 29, 2022
Tweet

More Decks by kumamotone

Other Decks in Technology

Transcript

  1. @kumamo_tone
 〜2016.03
 Tsukuba Univ. Computer Science Master
 
 2016.04〜2019.11
 Software

    Engineer(iOS/Android) @Yahoo! JAPAN
 
 2019.12〜NOW
 Software Engineer(iOS) @merpay
 https://kuma.dev https://twitter.com/kumamo_tone mercariでのSlack名は @kumamon 

  2. 関連セッション
 • Meet the regex (22分)
 ◦ 概要と使い方、Unicodeの対応について
 • Swift

    Regex: Beyond the basics (11分)
 ◦ 名前から上級者向け感がするが短いしそうでもない
 ▪ 文字列から情報を抽出する例の紹介
 ▪ カスタムのパーサを作る方法
 • What’s new in Swift (13分)
 ◦ 軽く触れているだけなのでRegexの理解は深まらない
 • Platforms State of the Union
 ◦ 開始10分ぐらいでXcodeを使ったデモ
 ◦ 見るとテンションが上がるので良い

  3. Swift-evolution 
 Regexに関連するプロポーザル • SE-0350 Regex Type and Overview 


    ◦ Regex<Output> と Regex<Output>.Match 型の追加 
 • SE-0351 Regex builder DSL
 ◦ @resultBuilder で正規表現を組み立てることができる 
 • SE-0354 Regex Literals
 ◦ 正規表現リテラル /.../ の追加
 • SE-0355 Regex Syntax and Run-time Construction 
 • SE-0357 Regex-powered string processing algorithms 
 
 直接は関連しないが関連するプロポーザル
 • SE-0348 buildPartialBlock for result builders 
 (2022年6月29日現在)

  4. 正規表現
 = Regular Expression
 正規
 表現
 ^[a-zA-Z0-9_+-]+(.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9] [a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,} こういうの ProTip:

    WWDCのセッションの人は、
 略語だからリジェックスとかじゃなくて
 レグエックス的な発音をしていた
 簡潔で便利だが、
 たまにしか書かないから
 毎回調べながら書いている 
 人が多いと言われている

  5. (New!) Regex リテラル
 let mailAddressRegex = /^[a-zA-Z0-9_+-]+(.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-z A-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}/ • /…/

    という形で正規表現を直接書けるようになった
 ◦ Perl, PHP, Ruby, JavaScript などでおなじみの形
 メールアドレスにマッチする正規表現 (https://www.javadrive.jp/regex-basic/sample/index13.html )

  6. (New!) Regex Builder
 • @resultBuilder(Swift5.4〜)を使って正規表現を
 組み立てることができる
 Regex { Anchor.startOfLine OneOrMore

    { CharacterClass( .anyOf("_+-"), ("a"..."z"), ("A"..."Z"), ("0"..."9") ) } ZeroOrMore { Capture { One(.any) OneOrMore { CharacterClass( .anyOf("_+-"), ("a"..."z"), ("A"..."Z"), ("0"..."9") ZeroOrMore { CharacterClass( ("a"..."z"), ("A"..."Z"), ("0"..."9") ) } "." } } Repeat(2...) { CharacterClass( ("a"..."z"), ("A"..."Z") ) } } ) } } } "@" OneOrMore { Capture { CharacterClass( ("a"..."z"), ("A"..."Z"), ("0"..."9") ) ZeroOrMore { CharacterClass( .anyOf("-"), ("a"..."z"), ("A"..."Z"), ("0"..."9") ) } 前ページのメールアドレスにマッチする正規表現

  7. 個人的に良いと思った点
 • 理解しやすい、再利用しやすい
 • コンパイル時に正しいか検証してくれる
 • 部分的に正規表現リテラルを使うことができるし使わなくても良い
 • Swift5 は

    UTF-8 (https://www.swift.org/blog/utf8-string/ )
 ◦ 正規表現に含めることができる
 • IDEのサポートがある
 ◦ 入力補完が効く
 ◦ シンタックスハイライトが効く
 ◦ Editor > Refactoring > Convert to Regex Builder
 で Regex Builder でRegex Builderに変換できる(!)

  8. 注意点とこれから調べたいこと
 • 稀なケースでソース互換性が失われるため、
 Swift 5.7 で正規表現リテラルを有効にするには -Xfrontend -enable-experimental-string-processing フラグが必要らしい
 (Swift

    6 からはデフォルトで有効になる予定)
 • フラグに関わらず #/…/# は使えるらしい
 ◦ /…/ は最初と最後のスペースが無視されるが、
 #/…/# は無視されないという違いがある
 • と思いきやXcode14 Beta2で普通に /…/ と書くといい感じに動いたりす る
 • と思いきやWWDCのセッションのコードをコピーしてきたらうまく動かな かったりする
 (2022年6月29日現在)

  9. まとめ
 • Swift 5.7 で 正規表現リテラル、Regex Builder DSL などの正規表現に 関する機能が追加された


    ◦ デフォルトで有効になるのは Swift 6 から
 ◦ 静的検査が効くし、Xcodeで
 Regex Builder DSLに簡単に変換できてたのしい
 Thank you for listening!