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 反馈 — 无需本地设置。
此课程中的所有课时
- 正则表达式字面量与匹配
- 捕获组
- RegexBuilder DSL
- 替换与拆分文本