我们如何从一个类型Range<String.Index>的范围中减go 多个类型Range<String.Index>的范围?

示例:

let str = "let <#name#> = <#value#>"
let range = str.startIndex..<str.endIndex

//the range of str is {0, 24}
//the range of <#name#> is {4, 8}
//the range of <#value#> is {15, 9}

如何从字符串的范围中减go 范围{4,8}和{15,9}以获得"let"和"="的范围

推荐答案

下面是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 ", " = "]

Swift相关问答推荐

绑定到可选值的非可选属性?'

在解码字符串时需要帮助.

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

如何在向照片添加文本时定义文本对齐、文本背景的Alpha和在文本之前添加图像

有没有一种方法可以迭代可编码的代码(例如,JSON解析中的每一项)?

NSWindow中以编程方式创建的TextField快捷方式与SwiftUI

我正在try 通过代码设置节中页眉和页脚的高度,但它不起作用

BLE 在 ESP32 和 Iphone 之间发送字符串

UIView.convert(_ point:to:)的意外行为

将 Encodable 扩展添加到 Swift 嵌套枚举

Pod lib lint 命令找不到 watchos 模拟器

使用泛型的 Swift 枚举值

用户输入以更改通过点击生成的形状大小

swiftui更改显示的 Select 器值

在 xcode 13 中的构建之间保持可访问性权限

Xcode 7.3 Swift 的语法高亮和代码完成问题

如何在 SwiftUI 中为删除和禁用配置 ContextMenu 按钮?

在 xcode8 中找不到 ModuleName-Swift.h 文件

Swift UITableView reloadData 在一个闭包中

如何在 iOS 上的 Swift 中获取 sharedApplication?