这对英语很有用:
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字形集群”.
代表“扩展的Unicode字形集群”.
例:
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] 举报,一经查实,本站将立刻删除。