所以我有这段代码找到 Range
的子串,并拆分新的行。
let string = "hello\nhello"
let rangesSplittedByLines: [Range] = string.split(separator: "\n").compactMap {
return string.range(of: $0)
}
但我需要这些范围作为 NSRange
.你怎么会得到 NSRange
所有子串的数组?
在闭包中创建一个 NSRange
从 Range<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
}
也没有理由去弥合 String
到 NSString
明确的。
但正如你所希望的 nsranges 反正像Martin的答案中的正则表达式是更有效的。
你可以使用正则表达式匹配,直接返回范围,而不是拆分字符串和 "重建 "范围。正则表达式中的 [^\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}