Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Swift Regex Builder
Search
kumamotone
June 29, 2022
Technology
1
620
Swift Regex Builder
at Recap of WWDC22
https://mercari.connpass.com/event/248712/
2022/06/29 #wwdc_mercari
kumamotone
June 29, 2022
Tweet
Share
More Decks by kumamotone
See All by kumamotone
AIエージェントを活用したアプリ開発手法の模索
kumamotone
1
1k
YOUTRUSTでやった技術発信まとめ
kumamotone
0
230
Integration Test で パフォーマンス計測する
kumamotone
0
590
VSCodeから一発でProxymanを起動する
kumamotone
0
690
スワイプで閉じれる画像ビューアを作る
kumamotone
1
920
ColorFiltered で カメラフィルタを実装する
kumamotone
1
580
SwiftUI の @State, @ObservedObject, @EnvironmentObject
kumamotone
4
1k
5分でわかる Kotlin Contracts
kumamotone
2
1.3k
しくみから理解するSwiftUI
kumamotone
5
2.7k
Other Decks in Technology
See All in Technology
Mackerel in さくらのクラウド
cubicdaiya
1
300
ABEMAにおける 生成AI活用の現在地 / The Current Status of Generative AI at ABEMA
dekatotoro
0
310
Amazon Bedrock AgentCoreのフロントエンドを探す旅 (Next.js編)
kmiya84377
1
160
20250818_KGX・One Hokkaidoコラボイベント
tohgeyukihiro
0
110
Observability for LLM Application lifecycle
ivry_presentationmaterials
0
100
Oracle Base Database Service:サービス概要のご紹介
oracle4engineer
PRO
1
20k
EKS Pod Identity における推移的な session tags
z63d
1
150
AI時代の大規模データ活用とセキュリティ戦略
ken5scal
1
260
会社にデータエンジニアがいることでできるようになること
10xinc
6
520
事業特性から逆算したインフラ設計
upsider_tech
0
240
datadog-distribution-of-opentelemetry-collector-intro
tetsuya28
0
120
歴代のWeb Speed Hackathonの出題から考えるデグレしないパフォーマンス改善
shuta13
6
520
Featured
See All Featured
Designing for Performance
lara
610
69k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Cult of Friendly URLs
andyhume
79
6.5k
Designing for humans not robots
tammielis
253
25k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.6k
Speed Design
sergeychernyshev
32
1.1k
Being A Developer After 40
akosma
90
590k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
It's Worth the Effort
3n
186
28k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Art, The Web, and Tiny UX
lynnandtonic
301
21k
A Tale of Four Properties
chriscoyier
160
23k
Transcript
2022/06/29 Recap of WWDC22 @kumamo_tone Swift Regex Builder
@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
概要 • 今秋登場予定のXcode14に組み込まれている Swift 5.7 で正規表現に関する機能が追加される ◦ 正規表現型 Regex の追加
◦ 正規表現リテラル /.../ の追加 ◦ Regex Builder DSL の追加
関連セッション • 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を使ったデモ ◦ 見るとテンションが上がるので良い
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日現在)
正規表現 = 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のセッションの人は、 略語だからリジェックスとかじゃなくて レグエックス的な発音をしていた 簡潔で便利だが、 たまにしか書かないから 毎回調べながら書いている 人が多いと言われている
(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 )
(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") ) } 前ページのメールアドレスにマッチする正規表現
(New!) Regex Builder • 正規表現リテラルを混ぜることもできる • 変数でまとめることができる • Foundationの機能で日付や通貨などのパースができる
個人的に良いと思った点 • 理解しやすい、再利用しやすい • コンパイル時に正しいか検証してくれる • 部分的に正規表現リテラルを使うことができるし使わなくても良い • Swift5 は
UTF-8 (https://www.swift.org/blog/utf8-string/ ) ◦ 正規表現に含めることができる • IDEのサポートがある ◦ 入力補完が効く ◦ シンタックスハイライトが効く ◦ Editor > Refactoring > Convert to Regex Builder で Regex Builder でRegex Builderに変換できる(!)
デモ • 以下の文字列から路線名を抽出するプログラムを作る 入力 参考にするページ 漢字の正規表現 https://tama-san.com/kanji-regex/ 「これは山手線ですか?」「そうです。埼京線です。」 出力 山手線
埼京線
注意点とこれから調べたいこと • 稀なケースでソース互換性が失われるため、 Swift 5.7 で正規表現リテラルを有効にするには -Xfrontend -enable-experimental-string-processing フラグが必要らしい (Swift
6 からはデフォルトで有効になる予定) • フラグに関わらず #/…/# は使えるらしい ◦ /…/ は最初と最後のスペースが無視されるが、 #/…/# は無視されないという違いがある • と思いきやXcode14 Beta2で普通に /…/ と書くといい感じに動いたりす る • と思いきやWWDCのセッションのコードをコピーしてきたらうまく動かな かったりする (2022年6月29日現在)
まとめ • Swift 5.7 で 正規表現リテラル、Regex Builder DSL などの正規表現に 関する機能が追加された
◦ デフォルトで有効になるのは Swift 6 から ◦ 静的検査が効くし、Xcodeで Regex Builder DSLに簡単に変換できてたのしい Thank you for listening!