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.