SwiftScanner 是一个纯 Swift 实现的字符串扫描器;它没有依赖项,完全支持 Unicode(谁不喜欢 emoji 呢?),拥有许多有用的功能,并且以 Swift 为中心而设计。StringScanner 是内置的 Apple NSScanner 的一个很好的替代品。
★★ 给我们的 Github 仓库点个 Star 来帮助我们吧! ★★
我还致力于其他几个你可能喜欢的项目。看看下面
| 库 | 描述 |
|---|---|
| SwiftDate | 在 Swift 中管理日期/时区的最佳方式 |
| Hydra | 编写更好的异步代码:async/await & promises |
| FlowKit | 一种新的表格管理声明式方法。忘记 datasource & delegates。 |
| SwiftRichString | Swift 中优雅且轻松的 NSAttributedString |
| SwiftLocation | 高效的定位管理器 |
| SwiftMsgPack | 快速/高效的 msgPack 编码器/解码器 |
SwiftScanner 使用字符串初始化,并维护一个内部索引,用于使用两个主要概念在字符串中前后导航
scan 返回字符串,同时增加内部索引peek 返回字符串,但不增加内部索引这些操作的结果返回收集的字符串或索引。如果由于错误(例如,eof、notFound、invalidInt...)操作失败,则会抛出异常,采用纯 Swift 风格。
Example:
let scanner = StringScanner("Hello this is SwiftScanner") let firstChar = try! scanner.scanChar() // get 'H' Example:
let scanner = StringScanner("15 apples") let parsedInt = try! scanner.scanInt() // get Int=15 Example:
let scanner = StringScanner("45.54 $") let parsedFloat = try! scanner.scanFloat() // get Int=45.54 0x[VALUE] (example: 0x0000000000564534)0X[VALUE] (example: 0x0929)#[VALUE] (example: #1602)If scan succeded scanner's position is updated at the end of the represented string, otherwise an exception ((.notFound, ).invalidHex, .eof) is thrown and index is not touched.
Example:
let scanner = StringScanner("#1602") let value = try! scanner.scanHexInt(.bit16) // get Int=5634 let scanner = StringScanner("#0x0929") let value = try! scanner.scanHexInt(.bit16) // get Int=2345 let scanner = StringScanner("#0x0000000000564534") let value = try! scanner.scanHexInt(.bit64) // get Int=5653812 Example:
let scanner = StringScanner("Hello <bold>Daniele</bold>") let partialString = try! scanner.scan(upTo: "<bold>") // get "Hello " Example:
let scanner = StringScanner("Hello, I've at least 15 apples") let partialString = try! scanner.scan(upTo: CharacterSet.decimalDigits) // get "Hello, I've at least " Example:
let scanner = StringScanner("HELLO i'm mark") let partialString = try! scanner.scan(untilIn: CharacterSet.lowercaseLetters) // get "HELLO" Example:
let scanner = StringScanner("This is a simple test I've made") let partialString = try! scanner.scan(upTo: "I've") // get "This is a simple test " Example:
let scanner = StringScanner("Never be satisfied 💪 and always push yourself! 😎 Do the things people say cannot be done") let delimiters = CharacterSet(charactersIn: "💪😎") while !scanner.isAtEnd { let block = scanner.scan(untilTrue: { char in return (delimiters.contains(char) == false) }) // Print: // "Never be satisfied " (first iteration) // "and always push yourself!" (second iteration) // "Do the things people say cannot be done" (third iteration) print("Block: \(block)") try scanner.skip() // push over the character } Example:
let scanner = StringScanner("Never be satisfied") let partialString = scanner.scan(5) // "Never" Peek 函数与 scan() 的概念相同,只是它不更新内部扫描器的 position 索引。 这些函数通常只返回匹配模式的 起始索引。
例子:
let scanner = StringScanner("Never be satisfied") let index = try! scanner.peek(upTo: "b") // return 6 例子:
let scanner = StringScanner("You are in queue: 123 is your position") let index = try! scanner.peek(upTo: CharacterSet.decimalDigits) // return 18 例子:
let scanner = StringScanner("654 apples") let index = try! scanner.peek(untilIn: CharacterSet.decimalDigits) // return 3 例子:
let scanner = StringScanner("654 apples in the bug") let index = try! scanner.peek(upTo: "in") // return 11 例子:
let scanner = StringScanner("I'm very 💪 and 😎 Go!") let delimiters = CharacterSet(charactersIn: "💪😎") while !scanner.isAtEnd { let prevIndex = scanner.position let finalIndex = scanner.peek(untilTrue: { char in return (delimiters.contains(char) == false) }) // Distance will return: // - 9 (first iteration) // - 5 (second iteration) // - 4 (third iteration) let distance = scanner.string.distance(from: prevIndex, to: finalIndex) try scanner.skip(length: distance + 1) } let scanner = StringScanner("💪 and 😎") let match = scanner.match("😎") // return false let scanner = StringScanner("I'm very 💪 and 😎 Go!") scanner.match("I'm very") // return true use_frameworks!
pod 'SwiftScanner'
github 'malcommac/SwiftScanner'
在您的 Package.swift 中将 swiftline 添加为依赖项。
import PackageDescription
let package = Package(name: "YourPackage",
dependencies: [
.Package(url: "https://github.com/malcommac/SwiftScanner.git", majorVersion: 0),
]
)
使用以下命令运行它们:
swift test 当前版本兼容:
Swift 4.x >= 1.0.4
Swift 3.x:最高 1.0.3
iOS 8 或更高版本
macOS 10.10 或更高版本
watchOS 2.0 或更高版本
tvOS 9.0 或更高版本
...以及几乎任何与 Swift 3 兼容并实现了 Swift Foundation Library 的平台
作为开源创作,欢迎任何帮助!
此库的代码在 MIT 许可证下获得许可;您可以在商业产品中使用它,没有任何限制。
唯一的要求是在您的“鸣谢/关于”部分添加一行,内容如下:
Portions SwiftScanner - http://github.com/malcommac/SwiftScanner Created by Daniele Margutti and licensed under MIT License.