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

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

概述这对英语很有用: public static func posOf(needle: String, haystack: String) -> Int { return haystack.distance(from: haystack.startIndex, to: (haystack.range(of: needle)?.lowerBound)!)} 但对于外来字符,返回的值总是太小.例 这对英语很有用:

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) // 1print(("का" 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).

总结

以上是内存溢出为你收集整理的可靠的函数来获取Swift中字符串中子字符串的位置全部内容,希望文章能够帮你解决可靠的函数来获取Swift中字符串中子字符串的位置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存