首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用(Swift)字符串为NSRange为NSRegularExpression提供正确的长度:参数是多少?

使用(Swift)字符串为NSRange为NSRegularExpression提供正确的长度:参数是多少?
EN

Stack Overflow用户
提问于 2019-08-16 05:34:47
回答 1查看 504关注 0票数 2

我很困惑如何在Swift中使用NSRegularExpression类,特别是NSRange:length参数。

一些教程说,NSRegularExpression只应应用于NSString实例,而另一些教程则认为,只要为NSRange:length参数提供utf8.countutf16.count,将其应用于(Swift)字符串实例是可以的。

代码语言:javascript
运行
AI代码解释
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-16 05:41:06

utf16计数是正确的,而不是utf8计数。或者,最好使用方便的初始化器,它将Range of String.Index转换为NSRange

代码语言:javascript
运行
AI代码解释
复制
let range = NSRange(str.startIndex..., in: str)

并将NSRange转换为String.Range

代码语言:javascript
运行
AI代码解释
复制
let range = Range(nsRange, in: str)

因此,综合起来:

代码语言:javascript
运行
AI代码解释
复制
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)我们不必再这样做的事实。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57525620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文