是否可以编写一个Swift函数,只替换扩展的grapheme集群的一部分,如👩👩👧👧;?
我想写一个函数,可以这样使用:是否可以编写一个Swift函数,只替换扩展的grapheme集群的一部分,如👩👩👧👧;?,swift,string,replace,emoji,unicode-string,Swift,String,Replace,Emoji,Unicode String,我想写一个函数,可以这样使用: let Based on the insights gained at Why are emoji characters like 👩👩👧👦 treated so strangely in Swift strings?, a sensible approach might be to replace Unicode scalars: extension String { func re
let Based on the insights gained at Why are emoji characters like 👩👩👧👦 treated so strangely in Swift strings?, a sensible approach might be to replace Unicode scalars:
extension String {
func replacingFirstOccurrence(of target: UnicodeScalar, with replacement: UnicodeScalar) -> String {
let uc = self.unicodeScalars
guard let idx = uc.index(of: target) else { return self }
let prefix = uc[uc.startIndex..<idx]
let suffix = uc[uc.index(after: idx) ..< uc.endIndex]
return "\(prefix)\(replacement)\(suffix)"
}
}
let基于在上获得的见解,一种明智的方法可能是替换Unicode标量:
let family1 = "Using the range(of:options:range:locale:)
the solution became quite concise:
extension String {
func replaceFirstOccurrence(of searchString: String, with replacementString: String) -> String {
guard let range = self.range(of: searchString, options: .literal) else { return self }
return self.replacingCharacters(in: range, with: replacementString)
}
}
扩展字符串{
func replacingFirstOccurrence(目标:UnicodeScalar,替换:UnicodeScalar)->字符串{
设uc=self.descalars
guard let idx=uc.index(of:target)else{return self}
让prefix=uc[uc.startIndex..使用该解决方案变得非常简洁:
首先在实例中查找searchString
的范围,如果找到范围,则该范围将替换为replacementString
。否则实例只返回自身。并且,由于范围(of:)
方法一找到匹配项就返回,返回的范围保证是第一次出现
“221”。将第一次出现的(of:“2”,替换为:“3”)//321
“如果它需要处理所有表情符号(包括序列),同时保留不可见字符(零宽度连接符、变体选择器和所有其他特殊情况),那么这确实有点棘手。”.Martin但为什么要打印DescalarvView?在你申请替换后,你会看到相同的情况?@OleggordiChuk:我无意中打印了family1
,而不是family2
,谢谢你让我知道。这样如何让b=“@OlegordiChuk:这将替换所有事件,而不仅仅是第一次(如果它起作用的话)@Oleggordichuk:看看OP的前一个问题,这正是关于这个问题的。使用.literal
选项,这确实很优雅,而且简单得多。.literal
被记录为“精确的字符对字符等价”,但显然是“字符”在本文中,它并不表示Swift字符
。我猜想它实际上意味着“精确的Unicode标量等价”或“精确的UTF-16等价”(因为。literal
是在NSString中定义的。CompareOptions
和NSString
基于unichar
)@MartinR我认为你是对的,但是因为你不能在Swift中使用格式错误的UTF-16进行搜索,它实际上意味着unicode标量等价。事实上,这没有什么区别。-也许关于.literal
的信息会对你的另一个答案有帮助?这也通过了我所有的测试,在我的生活中感觉更自在图书馆,谢谢!