Sweep

Swift Package Manager Mac + Linux Twitter: @johnsundell

欢迎使用 Sweep —— 一个强大而快速,且易于使用的 Swift 字符串扫描库。扫描任何字符串中出现在两组字符之间的子字符串 —— 例如,从用户定义的文本字符串中解析出标识符或元数据。

Sweep 可以作为一个通用的字符串扫描算法直接添加到项目中,或者作为自定义的、更高级别扫描实现的基础。它的目标是补充 Swift 标准库内置的字符串处理 API,无论是在设计方面,还是在其高效的实现方式上,都与 Swift 的各种字符串约定保持一致。

示例

开始使用 Sweep 最简单的方法是调用它添加到 StringProtocol 之上的 substrings 方法 —— 这意味着你可以在“普通”字符串和 Substring 值上使用它。

这是一个示例,我们在其中扫描 HTML 标签的字符串,并识别字符串中出现的所有标签名称,以及应以粗体呈现的任何文本

import Sweep

let html = "<p>Hello, <b>this is bold</b>, right?</p>"
let tags = html.substrings(between: "<", and: ">")
print(tags) // ["p", "b", "/b", "/p"]

let boldText = html.substrings(between: "<b>", and: "</b>")
print(boldText) // ["this is bold"]

Sweep 还可以扫描不同的模式,例如出现在扫描字符串开头或结尾的前缀。在这里,我们使用这些功能来识别 Markdown 格式文本字符串中的标题

import Sweep

let markdown = """
## Section 1

Text

## Section 2
"""

let headings = markdown.substrings(between: [.prefix("## "), "\n## "],
                                   and: [.end, "\n"])

print(headings) // ["Section 1", "Section 2"]

由于 Sweep 的设计旨在与 Swift 内置的字符串 API 无缝配合,因此它允许我们使用内置功能和 Sweep 添加的 API 组合出更强大的字符串扫描算法 —— 例如,在这里我们正在从使用自定义语法编写的字符串中解析出一个标签数组

import Sweep

let text = "{{tags: swift, programming, xcode}}"
let tagStrings = text.substrings(between: "{{tags: ", and: "}}")
let tags = tagStrings.flatMap { $0.components(separatedBy: ", ") }
print(tags) // ["swift", "programming", "xcode"]

Sweep 的设计也力求高效,并且只对它扫描的每个字符串进行单次遍历 —— 无论你想扫描多少种不同的模式。在这个例子中,我们使用两个自定义匹配器来解析字符串中的两段元数据

import Sweep

let text = """
url: https://swiftbysundell.com
title: Swift by Sundell
"""

var urls = [URL]()
var titles = [String]()

text.scan(using: [
    Matcher(identifiers: ["url: "], terminators: ["\n", .end]) { match, range in
        let string = String(match)
        let url = URL(string: string)
        url.flatMap { urls.append($0) }
    },
    Matcher(identifiers: ["title: "], terminators: ["\n", .end]) { match, range in
        let string = String(match)
        titles.append(string)
    }
])

print(urls) // [https://swiftbysundell.com]
print(titles) // ["Swift by Sundell"]

Sweep 不仅在复杂度方面高效,而且还具有非常低的内存开销,这归功于它根据 Swift 现代字符串约定构建 —— 充分利用了 SubstringString.Index 等类型,并在执行扫描时避免了不必要的复制和突变。

安装

Sweep 以 Swift 包的形式分发,建议使用 Swift Package Manager 安装它,方法是在你的项目 Package.swift 文件中将其声明为依赖项

.package(url: "https://github.com/JohnSundell/Sweep", from: "0.1.0")

有关更多信息,请参阅 Swift Package Manager 文档

贡献与支持

Sweep 完全开源开发,非常欢迎您的贡献。

在开始在任何项目中使用 Sweep 之前,强烈建议您花几分钟时间熟悉其文档和内部实现(所有内容都放在单个文件中!),这样您就可以准备好解决可能遇到的任何问题或边缘情况。

要了解更多关于用于实现 Sweep 的原则,请查看 Swift by Sundell 上的 “Swift 中的字符串解析”

Sweep 不提供基于 GitHub Issues 的支持,而是鼓励用户积极参与其持续开发 —— 通过修复他们遇到的任何错误,或改进任何被发现不足的文档。

如果您希望进行更改,请打开一个 Pull Request —— 即使它仅包含您计划更改的草稿,或重现问题的测试 —— 我们可以在那里进一步讨论。

希望您喜欢使用 Sweep!😀