查找被新行分割的所有子串的NSRanges。

问题描述 投票:0回答:1

所以我有这段代码找到 Range的子串,并拆分新的行。

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

但我需要这些范围作为 NSRange.你怎么会得到 NSRange 所有子串的数组?

swift string nsrange
1个回答
2
投票

在闭包中创建一个 NSRangeRange<String.Index>

let string = "hello\nhello"
let rangesSplittedByLines: [NSRange] = string.split(separator: "\n").map {
    return NSRange(string.range(of: $0)!, in: string)
}

但还有一个问题。该代码返回 [{0, 5}, {0, 5}] 因为 range(of: 总是返回 第一 匹配。

这就解决了这个问题,它通过将起始索引移动到最近一次匹配之后的位置来切分字符串。

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: $0)!
    let nsRange = NSRange(swiftRange, in: string)
    startIndex = swiftRange.upperBound
    return nsRange
}

也没有理由去弥合 StringNSString 明确的。

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


3
投票

你可以使用正则表达式匹配,直接返回范围,而不是拆分字符串和 "重建 "范围。正则表达式中的 [^\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 { $0.range }

print(ranges) // [{0, 5}, {6, 5}
© www.soinside.com 2019 - 2024. All rights reserved.