微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可靠的函数来获取Swift中字符串中子字符串的位置

这对英语很有用:

public static func posOf(needle: String,haystack: String) -> Int {
    return haystack.distance(from: haystack.startIndex,to: (haystack.range(of: needle)?.lowerBound)!)
}

但对于外来字符,返回的值总是太小.例如,“का”被认为是一个单位而不是2个单位.

posOf(needle: "काम",haystack: "वह बीना की खुली कोयला खदान में काम करता था।") // 21

我后来在NSRange中使用21(位置:长度:),其中需要28才能使NSRange正常工作.

解决方法

Swift String是Characters和每个Character的集合
代表“扩展的Unicode字形集群”.

Nsstring是UTF-16代码单元的集合.

例:

print("का".characters.count) // 1
print(("का" as Nsstring).length) // 2

Swift String范围表示为Range< String.Index>,
和Nsstring范围表示为NSRange.

您的函数从头开始计算字符数
干草堆到针的开头,这是不同的
从UTF-16代码点的数量.

如果你需要“NSRange兼容”
字符数,那么最简单的方法就是使用
Nsstring的range(of :)方法

let haystack = "वह बीना की खुली कोयला खदान में काम करता था।"
let needle = "काम"

if let range = haystack.range(of: needle) {
    let pos = haystack.distance(from: haystack.startIndex,to: range.lowerBound)
    print(pos) // 21
}

let nsRange = (haystack as Nsstring).range(of: needle)
if nsRange.location != NSNotFound {
    print(nsRange.location) // 31
}

或者,使用Swift字符串的utf16视图
计算UTF-16代码单位:

if let range = haystack.range(of: needle) {
    let lower16 = range.lowerBound.samePosition(in: haystack.utf16)
    let pos = haystack.utf16.distance(from: haystack.utf16.startIndex,to: lower16)
    print(pos) // 31
}

(例如,参见
NSRange to Range<String.Index>更多方法在Range< String.Index>之间进行转换和NSRange).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐