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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
刘小哈哈哈36 分钟前
封装了一个iOS多分区自适应宽度layout
macos·ios·cocoa
Lexiaoyao201 小时前
SwiftUI 字体系统详解
swiftui·swift
YungFan1 小时前
Swift 6.1 新特性
swift
勤劳打代码1 小时前
剑拔弩张——焦点竞争引的发输入失效
flutter·客户端·设计
布多5 小时前
Tagged Pointer:苹果工程师的内存优化艺术
ios·源码
Rudon滨海渔村6 小时前
新旧iPhone相册复制 - 相册图片视频对拷 - 换机 - 迁移设备数据 - 免费开源爱思助手
ios·iphone
清晨細雨21 小时前
UniApp集成极光推送详细教程
android·ios·uni-app·极光推送
ii_best1 天前
iOS 按键越狱脚本支持一键新机软件教程
ios
lilili啊啊啊1 天前
查看iphone手机的使用记录-克魔实战
ios·智能手机·iphone
鸿蒙布道师1 天前
鸿蒙NEXT开发随机工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei