gpt4 book ai didi

ios - 什么是正确的长度 : argument to provide to NSRange for NSRegularExpression using a (Swift) String?

转载 作者:可可西里 更新时间:2023-11-01 01:06:57 25 4
gpt4 key购买 nike

我对如何在 Swift 中使用 NSRegularExpression 类感到困惑,尤其是 NSRange:length 参数。

一些教程说 NSRegularExpression 应该只应用于 NSString 实例,而其他人则说只要你提供 utf8.countutf16 就可以将它应用于(Swift)字符串实例.count:NSRange 的length 参数:

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))
}
}

以下引自此 source :

Due to the way strings are handled differently in Swift and Objective-C, you will need to provide the NSRange instance with a string length from NSString, and not from String.

This is, roughly speaking, because NSString uses fixed-width encoding and String uses variable-width encoding.

此外,关于在 Swift 中记录 NSRegularExpression 类,以下文档真的是 Apple 所能做的最好的吗?

https://developer.apple.com/documentation/foundation/nsregularexpression

我至少希望有一个类的属性和方法列表,但它只显示了一些示例。有没有更详细的文档?

最佳答案

utf16 计数是正确的,而不是 utf8 计数。或者,最好使用方便的初始化程序,它将 String.IndexRange 转换为 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 Efficient Interactions with Frameworks ,其中讨论了 (a) 我们在处理范围时使用 UTF16 的历史; (b) 事实上,我们不必再这样做了。

关于ios - 什么是正确的长度 : argument to provide to NSRange for NSRegularExpression using a (Swift) String?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57525620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com