swift 5.7 开始,再也不用背正则表达式语法了

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

前面介绍了一些关于正则表达式的常规用法,其实在 WWDC 2022 上,swift 5.7 中带来了字符串匹配相关的重大升级,其中就包括正则方面的新功能,今天就来讲讲。

Regex

Regex 类型是 iOS 16 新出的一个类型,利用这个类型,你可以很轻易地生成正则表达式:

java 复制代码
let pattern = #"(\d+)"#
let regex = try Regex(pattern)

这种创建方式和 NSRegularExpression 差不多,首先,你还是需要将特殊符号用反斜杠标记,其次,你需要使用 try 来捕获异常情况。

为了避免上述情况,swift 出了一种使用两个斜杠"/.../"来直接生成 Regex 的方法,以上代码等同于:

javascript 复制代码
let regex1 = /(\d+)/

这种通过正则语法糖的方式生成正则表达式时,可以在编译器检查是否有语法错误,还有 Xcode 语法突出显示。

使用这个表达式可以检测字符串中的名称和数字:

scss 复制代码
let regex = /(\w+)\s+(\d+)/
let input = "Tom 123 xyz"
if let result = input.firstMatch(of: regex) {
  print(result.0)  // Tom 123
  print(result.1)  // Tom
  print(result.2)  // 123
}

输出的结果是一个元组,第一个值正则表达式匹配的所有内容,第二个值是捕获的第一个子字符串,第三个值是捕获的第二个子字符串,以此类推。

也可以用元组命名每个属性的名字:

scss 复制代码
let regex = /(\w+)\s+(\d+)/
let input = "Tom 123 xyz"
if let (matched, name, count) = input.firstMatch(of: regex)?.output {
    print(matched)  // Tom 123
    print(name)  // Tom
    print(count)  // 123
}

我们还可以在正则表达式里直接命名捕获的变量:

javascript 复制代码
let input = "Tom 123 xyz"
let regex = /(?<name>\w+)\s+(?<count>\d+)/
if let match = input.firstMatch(of: regex) {
    print(match.name)   // Tom
    print(match.count)  // 123
}

不同的匹配方式

swift 提供了几种不同的方法,可以用来匹配正则表达式:

javascript 复制代码
// 首个匹配
input.firstMatch(of: regex)
// 完整匹配
input.wholeMatch(of: regex)
// 前缀匹配
input.prefixMatch(of: regex)

let line = "Tom   1234"
// 将空格替换成逗号
let line1 = line.replacing(/\s+/,with:",")  // Tom,1234
// 去除字母和空格
let line2 = line.trimmingPrefix(/\w+\s+/)   // 1234
// 使用空格拆分
let fields = line.split(separator: /\s+/)   // ["Tom","1234"]

正则表达式生成器

除此之外,swift 还提供了正则表达式构建器 DSL,可以以更结构化,可读性更高的方法来构建你想要的正则表达式。

首先导入 RegexBuilder 模块:

arduino 复制代码
import RegexBuilder

然后构建正则表达式:

javascript 复制代码
let regex = Regex {
    Capture {
        OneOrMore(.word) // 一个或多个单词
    }

    OneOrMore(.whitespace) // 一个或多个空格

    Capture {
   OneOrMore(.digit) // 一个或多个数字
    }
}

let input = "Tom 123 xyz"
if let match = input.firstMatch(of: regex) {
    let name = match.1    // Tom
    let count = match.2   // 123
}

以前的正则表达式语法非常难以记忆,有了这套 DSL 构建器之后,正则将会简单很多,除了上边用到的 OneOrMore 之外,还有很多可用的语法表达式,以下是一些常用的:

  • One 精确匹配出现一次

  • OneOrMore 匹配出现一次或多次

  • ZeroOrMore 匹配出现零次或一次

  • Lookahead 仅当其内容在给定位置匹配时才允许匹配继续

  • NegativeLookahead 仅当其内容在给定位置不匹配时才允许继续匹配

  • Repeat 指定次数的匹配

其中可输入的常用参数有:

  • .any 与任何元素匹配的字符类

  • .anyNonNewline 与任何非换行符元素匹配的字符类

  • .digit 任意数字

  • .hexDigit 任何十六进制数字

  • .word 任何单词字符

  • .whitespace 任何空格字符

其他内容大家可以自行探索一下。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
2501_916008896 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
忆江南7 小时前
Flutter深度全解析
ios
山水域7 小时前
Swift 6 严格并发检查:@Sendable 与 Actor 隔离的深度解析
ios
楚轩努力变强7 小时前
iOS 自动化环境配置指南 (Appium + WebDriverAgent)
javascript·学习·macos·ios·appium·自动化
游戏开发爱好者81 天前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
黑码哥1 天前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
2501_915106321 天前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
2501_915106321 天前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
熊猫钓鱼>_>1 天前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
徐同保2 天前
通过ip访问nginx的服务时,被第一个server重定向了,通过设置default_server解决这个问题
ios·iphone