我很困惑如何在Swift中使用NSRegularExpression
类,特别是NSRange
的:length
参数。
一些教程说,NSRegularExpression只应应用于NSString实例,而另一些教程则认为,只要为NSRange
的:length
参数提供utf8.count
或utf16.count
,将其应用于(Swift)字符串实例是可以的。
var str : String = "#tweak #wow #gaming"
if let regex = try? NSRegularExpression(pattern: "#[a-z0-9]+", options: .caseInsensitive) {
regex.matches(in: str, options: [], range: NSRange(location: 0, length: str.utf8.count)).map {
print(str.substring(with: $0.range))
}
}
以下是此来源的引号:
由于Swift和Objective中处理字符串的方式不同,您需要为NSRange实例提供来自NSString的字符串长度,而不是来自字符串的字符串长度。 粗略地说,这是因为NSString使用固定宽度编码,而字符串使用可变宽度编码.
此外,以下文档真的是苹果在Swift中记录NSRegularExpression
类的最佳方法吗?
https://developer.apple.com/documentation/foundation/nsregularexpression
至少我希望得到这个类的属性和方法的列表,但它只显示了一些示例。还有更详细的文件吗?
发布于 2019-08-16 05:41:06
utf16计数是正确的,而不是utf8计数。或者,最好使用方便的初始化器,它将Range
of String.Index
转换为NSRange
let range = NSRange(str.startIndex..., in: str)
并将NSRange
转换为String.Range
let range = Range(nsRange, in: str)
因此,综合起来:
let str = "#tweak #wow #gaming"
if let regex = try? NSRegularExpression(pattern: "#[a-z0-9]+", options: .caseInsensitive) {
let nsRange = NSRange(str.startIndex..., in: str)
let strings = regex.matches(in: str, range: nsRange).compactMap {
Range($0.range, in: str).map { str[$0] }
}
print(strings)
}
参见WWDC 2017 与框架的高效互动,其中讨论了(a)我们在处理范围时对UTF16的历史使用;以及(b)我们不必再这样做的事实。
https://stackoverflow.com/questions/57525620
复制相似问题