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

Swift 5.7で変わる正規表現を試してみよう

ainame
September 12, 2022

Swift 5.7で変わる正規表現を試してみよう

現在swift-evolutionでは大量のproposalと共に長年Swift上で不便だった正規表現関連の実装を刷新する流れが続いています。実際にWWDC 22でもSwift 5.7のリリースとともにRegexBuilderと正規表現リテラルが導入されることが発表されています。

このトークではNSRegularExpressionやNSStringにおける課題がどのように解決されているかをswift-evolutionの各proposalをもとに振り返り、iOSやサーバーサイドでのアプリケーションや文字列処理が生きてくる書き捨てのスクリプト(例えばログ解析など)でどれぐらい実用的に利用できるのかをベンチマーク結果を添えて検証していきます。

特に普段Rubyなどで書くことが多い書き捨てスクリプトを置き換えるポテンシャルがあるのかどうかに個人的に興味があります!!いかに!?

ainame

September 12, 2022
Tweet

More Decks by ainame

Other Decks in Technology

Transcript

  1. 自己紹介 @ainame / 生井智司/ Satoshi Namai • Senior iOS Engineer

    at Cookpad Ltd*1 • イギリス地方都市ブリストル在住 • リモート参加 *1 https://careers.cookpad.com/
  2. https://cookpad.connpass.com/event/254459/ enum で Key Paths のような機能を実 現する Case Paths by

    アイカワ Maintainability Indexを計測することで iOSプロジェクトのコードの保守性を改善し た話 by toya108 DocC Documentation Archiveをアプ リ開発で活用してみよう by あおい OpenAPIのクライアント自動生成を現場に導 入していくためのノウハウ by imajin
  3. 今日話すこと • 新しい正規表現を試す方法 • これまでのSwiftでの正規表現 • 正規表現リテラル / Regex Builder

    • swift-evoltuionから読み解く推しポイント • パフォーマンスについて *正規表現そのものに関してはある程度  知っている前提で話します
  4. 新しい正規表現を試す方法 Swift 5.7が必要で開発中のバージョンはXcode 14 betaで 既に利用可能で今年秋頃に正式版とともにリリースされる見込み 主な変更点 • if let

    の導入 / 型推論の改善 • Genericsの改善 • Distoributed Actorの導入 • 正規表現リテラル+Regex Builderによる文字列処理 https://www.swift.org/blog/swift-language-updates-from-wwdc22/
  5. 新しい正規表現を試す方法 • Xcode 14 (beta)を使う ◦ Playgroundが楽 ◦ macOSがVenturaでなければiOS環境で試す ▪

    RegexはmacOS 13から、iOS 16から利用できる • オンライン上で試す ◦ @k_katsumiさん製 https://swiftregex.com/
  6. これまでのSwiftの正規表現 • Swiftではこれまでも正規表現は利用できた ◦ NSRegularExpression ◦ NSString由来のメソッド ▪ range(of:,options:,range:,locale) ▪

    replacingOccurrences(of:,with:,options:,range:) • 使いづらい(個人の感想) ◦ NSString由来のメソッドは用途が限られている ◦ SwiftのStringのようなUnicodeの挙動が無い
  7. Regex Builder “I had a problem so I wrote a

    regular expression. Now I have two problems.” 正規表現は問題解決に便利だが構文が複雑なので長期的にメ ンテナンスするのが難しい Regex Builderは正規表現の問題点を解決するために導入され たDSL
  8. 正規表現リテラル vs Regex builder • リテラルは簡潔に書けるのがメリット ◦ シンプルなパターンを使う時に向いている • Regex

    builderは構造化出来る ◦ 可読性を上げるためコンポーネント化が可能 ◦ Capture時に任意の型でパースした結果を取り出せる ◦ 正規表現リテラルも組み込める ◦ コードの補完があるので書きやすい • 適材適所 • XcodeでリテラルをRegex Builder変換できる
  9. swift-evolution swift-evolutionでは6つの提案が承認されている • SE-0350 Regex Type and Overview • SE-0351

    Regex builder DSL • SE-0354 Regex Literals • SE-0355 Regex Syntax and Run-time Construction • SE-0357 Regex-powered string processing algorithms • SE-0363 Unicode for String Processing
  10. メジャーな正規表現の方言・機能をカバー • 正規表現エンジンの仕様や実装はいろいろある • 他の言語で動作するパターンが使えないと悲しい • Swiftの正規表現エンジンでは以下に対応 ◦ PCRE 2

    - “業界標準” Perlの仕様がベース ◦ Oniguruma - Rubyに一度導入され様々な機能が追加された ◦ ICU - NSReguarExpressionで使われている ◦ .NET - ユニークな機能が追加されている
  11. Unicodeの仕様に準拠した正確な文字列比較 • Unicodeには正規表現の実装のガイドライン*1が存在 ◦ Basic Unicode Support: Level 1 ◦

    Extended Unicode Support: Level 2 ◦ Tailored Support: Level 3 (撤回済み) • Swift 5.7はLevel1とLevel 2のうちの重要な仕様を実装 ◦ Canonical Equivalents ◦ Extended Grapheme Clusters and Character Classes with Strings ◦ Default Word Boundaries *1 Unicode® Technical Standard #18 https://unicode.org/reports/tr18/
  12. RegexBenchmark • Swift 5.7の正規表現の開発に利用されている apple/swift-experimental-string-processingに付属する公 式のベンチマーク • 以下の環境で実行 ◦ Branch:

    swift/release/5.7 (3c9a2e) ◦ Snapshot: swift-5.7-DEVELOPMENT-SNAPSHOT-2022-08-02-a ◦ MacBook Pro 16inch (2021) / CPU: M1 Max / Memory: 64GB
  13. まとめ • Swift 5.7の正規表現は非常に丁寧に仕様が検討されてる ◦ NSRegularExpressionの使いづらさを解決した標準ライブラリ ◦ ツールのサポートによる生産性の高い正規表現リテラル ◦ 拡張性とメンテナンス性が高いRegex

    builder ◦ Unicode-awareなマッチングエンジン • パフォーマンスは今後に期待 ◦ 仕様の実装が先で最適化は後なのは分かる ◦ とはいえiOSアプリで入力値のバリデーション用途などで 使う分にはほとんど気にしなくて良い