查找由新行拆分的所有子字符串的 NSRanges
Find NSRanges of all substrings splitted by new lines
所以我有这段代码通过拆分新行来查找 Range
s 个子字符串:
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}
所以我有这段代码通过拆分新行来查找 Range
s 个子字符串:
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}