Strix 🦉

Swift Swift Compatibility Platform Compatibility codecov

Strix 是一个用 Swift 编写的解析器组合子库。

安装

Swift 包管理器

dependencies: [.package(url: "https://github.com/nearfri/Strix.git", from: "2.0.0")],
targets: [.target(name: "<Your Target Name>", dependencies: ["Strix"])]

示例

CSV 解析

年份 制造商 型号 描述 价格
1997 福特 E350 空调, 防抱死刹车, 天窗 3000.00
1999 雪佛兰 Venture “加长版” 4900.00
1999 雪佛兰 Venture “加长版,超大” 5000.00
1996 吉普 大切诺基 必卖!
空气悬挂, 天窗, 豪华配置
4799.00

以上数据表格可以用 CSV 格式表示如下

Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00

它由数据记录组成,数据记录由行表示,行由一个或多个字段组成,字段之间用逗号分隔。复杂的 CSV 实现允许特殊字符,例如换行符、逗号和双引号。它们通过在包含它们的字段周围加上“(双引号)字符来允许使用。嵌入的双引号用一对连续的双引号表示。

以下是一个 CSV 解析器的示例

import Strix

let doubleQuote: Parser<Character> = .character("\"")
let twoDoubleQuote: Parser<Character> = Parser.string("\"\"") *> .just("\"")
let escapedText: Parser<String> = Parser.many((.none(of: "\"") <|> twoDoubleQuote))
    .map({ String($0) })
let escapedField: Parser<String> = doubleQuote *> escapedText <* doubleQuote

let nonSeparator: Parser<Character> = .satisfy("non-separator", { $0 != "," && !$0.isNewline })
let nonEscapedField: Parser<String> = .skipped(by: .many(nonSeparator))

let field: Parser<String> = escapedField <|> nonEscapedField
let record: Parser<[String]> = .many(field, separatedBy: .character(","))

let csvParser: Parser<[[String]]> = .many(record, separatedBy: .newline)

将上述 CSV 作为 csvString 传递给 try csvParser.run(csvString) 将返回

[
    ["Year", "Make", "Model", "Description", "Price"],
    ["1997", "Ford", "E350", "ac, abs, moon", "3000.00"],
    ["1999", "Chevy", "Venture \"Extended Edition\"", "", "4900.00"],
    ["1999", "Chevy", "Venture \"Extended Edition, Very Large\"", "", "5000.00"],
    ["1996", "Jeep", "Grand Cherokee", "MUST SELL!\nair, moon roof, loaded", "4799.00"]
]

如果您想要更多示例,请参阅 StrixParsers

许可证

Strix 是在 MIT 许可证下发布的。有关更多信息,请参阅 LICENSE。