gpt4 book ai didi

swift - 在 Swift 中获取字符串中子字符串位置的可靠函数

转载 作者:搜寻专家 更新时间:2023-10-30 23:05:41 26 4
gpt4 key购买 nike

这对英语很有效:

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(location:length:) 中使用 21,它需要为 28 才能使 NSRange 正常工作。

最佳答案

swift StringCharacter 的集合s,每个 Character代表一个“扩展的 Unicode 字素簇”。

NSString是 UTF-16 编码单元的集合。

例子:

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

swift String范围表示为 Range<String.Index> ,和 NSString范围表示为 NSRange .

您的函数计算 Character 的数量从一开始干草堆到针的开始,这是不同的来自 UTF-16 代码点的数量。

如果你需要一个“NSRange兼容”字符数然后最简单的方法是使用 range(of:) NSString的方法| :

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
}

或者,使用 utf16 Swift 字符串的 View 计算 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 中获取字符串中子字符串位置的可靠函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41282114/

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