0Pricing
Swift Academy · 课时

RegexBuilder DSL

使用易读的构建器组合正则表达式。

RegexBuilder DSL 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

RegexBuilder DSL

复杂的正则表达式字面量很难阅读。RegexBuilder 模块可以让您使用结果构建器 DSL 和带名称的组件及类型,通过 Swift 代码构建模式。

导入 RegexBuilder

导入模块,然后使用 Regex { ... } 构建器构造一个 Regex。其中,每一行都是模式中的一个连续部分。

import RegexBuilder

let re = Regex {
    "ID-"
    OneOrMore(.digit)
}
print("ID-42".contains(re))

OneOrMore

OneOrMore(...) 会匹配给定组件一次或多次,相当于 +。.digit 是内置的字符类。

import RegexBuilder

let number = Regex {
    OneOrMore(.digit)
}
if let m = "abc789".firstMatch(of: number) {
    print(m.0)
}

ZeroOrMore 和 Optionally

ZeroOrMore 表示 *,Optionally 表示 ?。它们可以让模式中的部分重复出现或跳过。

import RegexBuilder

let re = Regex {
    "color"
    Optionally("u")
    "r"
}
print("colour".wholeMatch(of: re) != nil)
print("color".wholeMatch(of: re) != nil)

Capture

Capture { ... } 会创建捕获组。匹配到的子字符串会出现在输出元组中,就像字面量中的圆括号一样。

import RegexBuilder

let re = Regex {
    "v"
    Capture { OneOrMore(.digit) }
}
if let m = "v123".wholeMatch(of: re) {
    print("Version: \(m.1)")
}

转换捕获结果

Capture 可以包含一个转换闭包,将匹配到的文本转换为类型化值,使输出结果直接成为 Int 或其他类型。

import RegexBuilder

let re = Regex {
    Capture {
        OneOrMore(.digit)
    } transform: { Int($0)! }
}
if let m = "42".wholeMatch(of: re) {
    let n: Int = m.1
    print(n + 1)
}

CharacterClass

使用 CharacterClass,或使用 .word、.whitespace 等内置项以及 ("a"..."z") 这样的范围,来定义允许出现的字符。

import RegexBuilder

let re = Regex {
    One(.word)
    ZeroOrMore(("a"..."z"))
}
print("hello".contains(re))

构建器中的锚点

添加 Anchor.startOfLine 和 Anchor.endOfLine,即可在构建器中加入位置断言。

import RegexBuilder

let re = Regex {
    Anchor.startOfLine
    OneOrMore(.digit)
    Anchor.endOfLine
}
print("100".wholeMatch(of: re) != nil)

可复用组件

您可以将子模式存储在变量中并组合它们,从而让大型正则表达式更加模块化且易于阅读。

import RegexBuilder

let field = Reference(Substring.self)
let re = Regex {
    Capture(as: field) { OneOrMore(.word) }
}
if let m = "name".firstMatch(of: re) {
    print(m[field])
}

多个捕获

每个 Capture 都会按顺序增加一个输出元素,因此日期解析器可以分别公开 year、month 和 day。

import RegexBuilder

let date = Regex {
    Capture { Repeat(.digit, count: 4) }
    "-"
    Capture { Repeat(.digit, count: 2) }
}
if let m = "2024-05".wholeMatch(of: date) {
    print("\(m.1) / \(m.2)")
}

选择 DSL 还是字面量

短模式适合使用字面量;较长且需要名称、类型和转换的模式适合使用 DSL。两者可以互换,甚至可以嵌套使用。

import RegexBuilder

let re = Regex {
    "#"
    Capture { /[0-9a-fA-F]{6}/ }
}
if let m = "#FF8800".wholeMatch(of: re) {
    print("Hex: \(m.1)")
}

快速检查

哪个 RegexBuilder 组件可以匹配某个内容一次或多次?

回顾

RegexBuilder DSL 使用 Regex { } 从 Swift 代码构建正则表达式,并使用 OneOrMore、Optionally、带转换的 Capture、字符类和锚点。它让复杂模式更易读且具有类型安全性。接下来,您将使用 replacing 和 split 修改文本。

常见问题解答

「RegexBuilder DSL」课时是免费的吗?

是的 — 「RegexBuilder DSL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「RegexBuilder DSL」这节课中我会学到什么?

使用易读的构建器组合正则表达式。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「RegexBuilder DSL」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 正则表达式字面量与匹配
  2. 捕获组
  3. RegexBuilder DSL
  4. 替换与拆分文本
← 返回 Swift Academy