下面是StringProtocol
的一个扩展,它将返回一个字符串的范围数组,该数组位于传入的范围之外:
extension StringProtocol {
func ranges(outsideOf ranges: [Range<String.Index>]) -> [Range<String.Index>] {
var res = [Range<String.Index>]()
var lastEnd = self.startIndex
// Iterate each provided range (sorted by lowerBound)
for range in ranges.sorted(by: { $0.lowerBound < $1.lowerBound }) {
// Added the result if this range has space before the previous range
if range.lowerBound > lastEnd {
res.append(Range(uncheckedBounds: (lastEnd, range.lowerBound)))
}
if range.upperBound > lastEnd {
lastEnd = range.upperBound
}
}
// If there's any space after the last range, add that to the result
if lastEnd < self.endIndex {
res.append(Range(uncheckedBounds: (lastEnd, self.endIndex)))
}
return res
}
}
以下是演示其用法的一些示例代码:
let str = "let <@name@> = <@value@>"
let nameRng = str.range(of: "<@name@>")!
let valueRng = str.range(of: "<@value@>")!
let ranges = str.ranges(outsideOf: [nameRng, valueRng])
print(ranges.map { str[$0] })
输出:
["let ", " = "]
个