👋🏼 我叫 Daniel Lyons,是一名 Swift 开发者,目前正在寻找工作。 我希望这个包对您和社区有所帮助。 如果是这样,请考虑查看并与他人分享我的开发者网站:dandylyons.github.io。 🙏🏼
NativeRegexExamples 是 Swift 社区可以:
Regex
解决方案,可在您的项目中使用@RegexActor
func foo() {
let ssnRegex = RegexLiterals.ssn
let string = "111-11-1111"
string.contains(ssnRegex) // true
string.wholeMatch(of: ssnRegex)
var text = """
one SSN -> 111-11-1111
222-22-2222 <- another SSN
"""
text.replace(ssnRegex, with: "___")
// text is now:
// one SSN -> ___
// ___ <- another SSN
}
不要只是使用库。 看看源代码,这样你就可以从中学习。 每个正则表达式都有一个文字定义和一个 RegexBuilder 定义。 例如
public extension RegexLiterals {
static let ssn = #/
# Area number: Can't be 000-199 or 666
(?!0{3})(?!6{3})[0-8]\d{2}
-
# Group number: Can't be 00
(?!0{2})\d{2}
-
# Serial number: Can't be 0000
(?!0{4})\d{4}
/#
}
public extension RegexBuilders {
static let ssn = Regex {
NegativeLookahead {
Repeat(count: 3) {
"0"
}
}
NegativeLookahead {
Repeat(count: 3) {
"6"
}
}
("0"..."8")
Repeat(count: 2) {
One(.digit)
}
"-"
NegativeLookahead {
Repeat(count: 2) {
"0"
}
}
Repeat(count: 2) {
One(.digit)
}
"-"
NegativeLookahead {
Repeat(count: 4) {
"0"
}
}
Repeat(count: 4) {
One(.digit)
}
}
.anchorsMatchLineEndings()
}
正则表达式是一种极其强大的工具,能够进行复杂的模式匹配、验证、解析等等。 然而,它可能很难使用,并且它具有非常深奥的语法,很容易搞砸。 每种语言都有自己的 Regex“风格”,而 Swift 在某些重要方面进行了改进:
但是,许多关于正则表达式的 Swift 资源都是关于较旧的技术,例如 NSRegularExpressions
或第三方 Swifty 库。 虽然这些技术和资源很棒,但它们并没有给我们机会学习和解锁原生 Swift Regex 的新功能。
Regex 也是一项存在了几十年的技术。 这意味着许多问题很久以前就已经在正则表达式中得到了解决。 更好的是,Swift Regex
字面量经过精心设计,可以与许多其他语言风格的正则表达式兼容,包括 Perl、Python、Ruby 和 Java。 我们不妨从其他社区的经验中学习!
非常感谢为 Swift 社区的利益所做的贡献。 请随时提交 PR 或 Issue!
所有数据类型都应该添加测试。 测试完全通过新的 Swift Testing 框架完成。 这应确保该库将来可在非 Xcode、非 Apple 平台上使用/测试。
抱歉,Swift Testing 仅适用于 Swift 6 及更高版本。 虽然,我看不出我们为什么不能将该库向后部署到 5.7 及更高版本。
我强烈建议使用 swiftregex.com,由 SwiftFiddle 提供。 这是一个强大的在线游乐场,用于测试 Swift Regex
es。 它最好的功能之一是它可以来回转换传统正则表达式模式和 Swift 的 RegexBuilder DSL。
Swift Regex
类型不是 Sendable
。 显然,这是因为 Regex
允许用户连接他们自己的自定义逻辑,因此 Swift 无法保证数据竞争安全。 因此,我已将库中的所有 Regex
都隔离到 @RegexActor
(库中定义的最小全局 actor)。 如果我能找到更好的解决方案,我将删除此 actor 隔离。 如果您直接在代码中使用库中的任何正则表达式,您很可能需要隔离到 @RegexActor
。 也就是说,您应该能够将库中的任何正则表达式复制并粘贴到您自己的代码中,然后您将不再受 @RegexActor
的限制。
swift-testing
的 笔记。将 NativeRegexExamples 作为包依赖项添加到项目的 Package.swift 中
// swift-tools-version:6.0
import PackageDescription
let package = Package(
name: "MyPackage",
dependencies: [
.package(
url: "https://github.com/DandyLyons/NativeRegexExamples",
.upToNextMinor(from: "0.0.1")
)
],
targets: [
.target(
name: "MyTarget",
dependencies: [
.product(name: "NativeRegexExamples", package: "NativeRegexExamples")
]
)
]
)
该项目处于早期开发阶段。 当前目标
非常欢迎您的贡献!
该项目根据 MIT 许可证获得许可。 有关详细信息,请参阅LICENSE 文件。