$30 off During Our Annual Pro Sale. View Details »

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. 2022/06/29 Recap of WWDC22

    @kumamo_tone

    Swift Regex Builder


    View Slide

  2. @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

    View Slide

  3. 概要

    ● 今秋登場予定のXcode14に組み込まれている

    Swift 5.7 で正規表現に関する機能が追加される

    ○ 正規表現型 Regex の追加

    ○ 正規表現リテラル /.../ の追加

    ○ Regex Builder DSL の追加


    View Slide

  4. 関連セッション

    ● 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を使ったデモ

    ○ 見るとテンションが上がるので良い


    View Slide

  5. Swift-evolution 

    Regexに関連するプロポーザル
    ● SE-0350 Regex Type and Overview

    ○ Regex と Regex.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日現在)


    View Slide

  6. 正規表現

    = 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のセッションの人は、

    略語だからリジェックスとかじゃなくて

    レグエックス的な発音をしていた

    簡潔で便利だが、

    たまにしか書かないから

    毎回調べながら書いている

    人が多いと言われている


    View Slide

  7. (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
    )


    View Slide

  8. (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")
    )
    }
    前ページのメールアドレスにマッチする正規表現


    View Slide

  9. (New!) Regex Builder

    ● 正規表現リテラルを混ぜることもできる

    ● 変数でまとめることができる

    ● Foundationの機能で日付や通貨などのパースができる


    View Slide

  10. 個人的に良いと思った点

    ● 理解しやすい、再利用しやすい

    ● コンパイル時に正しいか検証してくれる

    ● 部分的に正規表現リテラルを使うことができるし使わなくても良い

    ● Swift5 は UTF-8 (https://www.swift.org/blog/utf8-string/
    )

    ○ 正規表現に含めることができる

    ● IDEのサポートがある

    ○ 入力補完が効く

    ○ シンタックスハイライトが効く

    ○ Editor > Refactoring > Convert to Regex Builder

    で Regex Builder でRegex Builderに変換できる(!)


    View Slide

  11. デモ

    ● 以下の文字列から路線名を抽出するプログラムを作る

    入力
    参考にするページ
    漢字の正規表現
    https://tama-san.com/kanji-regex/
    「これは山手線ですか?」「そうです。埼京線です。」
    出力
    山手線
    埼京線

    View Slide

  12. 注意点とこれから調べたいこと

    ● 稀なケースでソース互換性が失われるため、

    Swift 5.7 で正規表現リテラルを有効にするには -Xfrontend
    -enable-experimental-string-processing
    フラグが必要らしい

    (Swift 6 からはデフォルトで有効になる予定)

    ● フラグに関わらず #/…/# は使えるらしい

    ○ /…/ は最初と最後のスペースが無視されるが、

    #/…/# は無視されないという違いがある

    ● と思いきやXcode14 Beta2で普通に /…/ と書くといい感じに動いたりす
    る

    ● と思いきやWWDCのセッションのコードをコピーしてきたらうまく動かな
    かったりする

    (2022年6月29日現在)


    View Slide

  13. まとめ

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

    ○ デフォルトで有効になるのは Swift 6 から

    ○ 静的検査が効くし、Xcodeで

    Regex Builder DSLに簡単に変換できてたのしい

    Thank you for listening!


    View Slide