查找由新行拆分的所有子字符串的 NSRanges

Find NSRanges of all substrings splitted by new lines

所以我有这段代码通过拆分新行来查找 Ranges 个子字符串:

let string = "hello\nhello"
let rangesSplittedByLines: [Range] = string.split(separator: "\n").compactMap {
    return string.range(of: [=10=])
}

但我需要这些范围 NSRange。 您将如何获得所有子字符串的 NSRange 数组?

在闭包中从 Range<String.Index>

创建一个 NSRange
let string = "hello\nhello"
let rangesSplittedByLines: [NSRange] = string.split(separator: "\n").map {
    return NSRange(string.range(of: [=10=])!, in: string)
}

但是还有一个问题。代码 returns [{0, 5}, {0, 5}] 因为 range(of: returns 始终是 第一个 匹配的范围。

这解决了问题,它通过将起始索引移动到最近匹配项之后的位置来对字符串进行切片

let string = "hello\nhello"
var startIndex = string.startIndex
let rangesSplittedByLines: [NSRange] = string.split(separator: "\n").map {
    let subString = string[startIndex...]
    let swiftRange = subString.range(of: [=11=])!
    let nsRange = NSRange(swiftRange, in: string)
    startIndex = swiftRange.upperBound
    return nsRange
}

并且没有理由明确地将 String 桥接到 NSString

但是如你所愿 nsranges 反正像 Martin 的回答中的正则表达式更有效。

您可以使用正则表达式匹配直接 returns 范围,而不是拆分字符串和“重建”范围。 [^\n]+ 模式匹配一​​个或多个不是换行符的字符。示例:

let string = "hello\nhello"

let regex = try! NSRegularExpression(pattern: #"[^\n]+"#)
let matches = regex.matches(in: string, range: NSRange(string.startIndex..., in: string))
let ranges = matches.map { [=10=].range }

print(ranges) // [{0, 5}, {6, 5}