WWDC22 | session110354 | Swift Regex简介

前言

今年我鼓起勇气报名参加了老司机周报的“WWDC22内参“的编写的计划。

报名的session是110357和110358,都是和Swift的新框架Regex有关的。

结果计划没有变化快,很多人都报名这两个session,最后编写这个版块的文章的任务也没有分配给我TAT

不过也无所谓了,本来还有点包袱的,现在一下就没了,我会说说我对session110354、 110357、110358的理解:

  • session 110354 What's new in Swift

  • session 110357 Meet Swift Regex

  • session 110358 Swift Regex: Beyond the basics

让我们开始吧~~~

Swift 5.7的新特性(What's new in Swift)

image.png

在session110354——What's new in Swift:

从视频的23:30开始到28:45结束,短短的5分钟内,介绍了Swift5.7的一个新特性,有关于字符串的处理与加工,针对Swift的Regex框架做了一个简洁又全面的介绍。

Swift目前对String处理的现状

根据视频中的内容,其实Apple的开发工程师对于目前Swift对于字符串数据的处理也觉得并不够优雅。

天下苦秦久矣!!!

image.png

通过对字符串进行separatorjoinmapindex切片等等一系列方法对字符串进行处理而获取有效信息,并不是提取信息的有效途径。

我们需要新的方式。而这个方式其实一直都存在,那就是正则表达式——Regex。

正则表达式的优缺点

正则表达式已经存在很久,最早可以追溯到上个世纪50年代。

虽然通过编写正则表达式,可以精准的匹配到想到捕获的信息,但是!!!

image.png

写正则表达式和理解别人写的正则表达式都是一件非常困难的事情,会让人蒙圈!!!

image.png

本来程序员头发就少,再抓两下就没了。。。

虽然在Foundation中有NSRegularExpression,而专门用Swift编写处理String的正则的库,在5.7才出现。

下面我们先简单聊一聊这个的Swift Regex。

Swift Regex简介

  • 通过在//之间的这种糖语法来编写的新的Regex类型,并进行使用。
let regex = /\h*([^<#+?)??\h<([^>#]+)>\h*(?:#|\Z)/
复制代码

image.png

  • Apple考虑到新手写正则的困难程度,通过Swift封装的糖语法,将其进行了更加人性化的封装,真香~
传统写法 Swift糖语法写法
image.png Snip20220616_69.png

通过noneof("<#")OneOrMoreOptionally这些语义化的代码API,让晦涩难懂的正则表达式从阅读到理解都得到了质的提升。

  • 同时Swift Regex的编写,使用类似SwiftUI中的定制DSL,通过声明式的语法,编写流畅,语义清晰。我个人感觉虽然有学习成本,但是相比较学习如何写正则表达式,这点成本不算什么。

Snip20220616_70.png

  • Apple的开发人员同时考虑到正则表达的式的可复用性,通过引入import RegexBuilder并让类型遵守RegexComponent让各位编写的正则可以进行复用。

image.png

  • Apple也考虑到了正则新、老手的不同的需求,在创建regex对的时候,在声明式的DSL中可以同时使用//Swift Regex内置的语法糖进行regex的构建,非常的灵活。

image.png

Swift Regex的简单总结

image.png

  • Swift Regex的正则表达式内核是开源的,也就是说可以在GitHub的Swift项目中自行学习与贡献代码。

  • Swift Regex对于字符串的处理,是广义上的字符串处理,因为它覆盖了Unicode编码支持,这里Apple非常凡尔赛的得瑟了一把,甚至在session110357中花了很大一部分精力说明这个问题,总之大概意思就是,只要是个在Unicode中被定义的字符,Swift Regex都能进行处理。

  • Swift Regex只能在macOS 13、iOS 16、tvOS 16、watchOS 9这些系统中内置了Swift正则内核的系统中才能进行使用。

下节预告

嗯,本来我是打算一篇文章把session110354、 110357、110358的理解一口气写完的,然后发现自己的时间与精力比较零散,想要一口气吃个大胖子太困难。

于是今天先到这里。

下一篇文章我会着重说明session110357、110358,针对里面通过编写正则提取信息的API用法进行整理,同时这两个session也有我看不明白的内容,也欢迎各位指导一二。

说实话5min的视频内容,光是翻译与理解并写成文字都已经1000+了,后面两个session加起来差不多50min了,想想还是蛮可怕的。

同时,我会参考我在Python中写爬虫中使用的经验,对Python、Swift Regex以及NSRegularExpression做一些简单的类比吧。

谢谢大家。

参考资料

猜你喜欢

转载自juejin.im/post/7109735742330372126