截断字符串的中间并替换它 - Swift

Posted

技术标签:

【中文标题】截断字符串的中间并替换它 - Swift【英文标题】:Truncate middle of String and replace it - Swift 【发布时间】:2021-08-01 02:20:07 【问题描述】:

我有一个这样的字符串:

0x829bd824b016326a401d083b33d092293333a830

我想留下前6个字符,留下最后4个:

0x829b...a830

我该怎么做?我在 Apple 文档中看到了 .firstIndex(of: "-") 选项,但那是用于删除特定字符,因此不适用。

【问题讨论】:

你想在标签或其他东西中显示这个吗?在这种情况下,您可以让UILabel 为您完成工作:***.com/questions/20417767/… @aheze 我将在 SwiftUI 视图中显示它,很可能在 Text("") 或标签中显示是的,我检查了您提供的链接,但它似乎不适用。唯一类似的选项是 NSLineBreakByTruncatingMiddle 但这只是让它为我做,我想要更具体的,比如把最后 4 和一些数字放在前面 【参考方案1】:

您可以使用drop 的一种方式,如下所示:

let stringTest: String = "0x829bd824b016326a401d083b33d092293333a830"
    
print(stringTest.replacingOccurrences(of: stringTest.dropFirst(6).dropLast(4), with: "...")) 

// It will print: 0x829b...a830

这里扩展

extension String 
    
    func replacingRange(indexFromStart: Int, indexFromEnd: Int, replacing: String = "") -> Self 
        return self.replacingOccurrences(of: self.dropFirst(indexFromStart).dropLast(indexFromEnd), with: replacing)
    
    
    func replacingRange2(indexFromStart: Int, indexFromEnd: Int, replacing: String = "") -> Self 
        return String(self.prefix(indexFromStart)) + replacing + String(self.suffix(indexFromEnd))
    


用例:

print(stringTest.replacingRange(indexFromStart: 6, indexFromEnd: 4, replacing: "..."))

来自Leo Dabus的Master扩展:

extension StringProtocol where Self: RangeReplaceableCollection 
    
    func replacing<S: StringProtocol>(indexFromStart: Int, indexFromEnd: Int, with string: S = "") -> Self 
        
        Self.init(replacingOccurrences(of: dropFirst(indexFromStart).dropLast(indexFromEnd), with: string))
        
    
    
    
    func replacing2<S: StringProtocol>(indexFromStart: Int, indexFromEnd: Int, with string: S = "") -> Self 

        Self.init(self.prefix(indexFromStart) + Self(string) + self.suffix(indexFromEnd))
        
    
    
    func replacing3<S: StringProtocol>(indexFromStart: Int, indexFromEnd: Int, with string: S = "") -> Self 

        Self.init(self.prefix(indexFromStart) + string[...] + self.suffix(indexFromEnd))
        
    
    

【讨论】:

@Arturo 你也可以只做str.prefix(6) + "..." + str.suffix(4)。只要确保字符串有足够的字符。 添加到@LeoDabus 如果没有足够的(let str = "asd"),结果将是asd...asd @Arturo:我也添加了扩展。 @swiftPunk 最好使用ClosedRange&lt;Int&gt; 并将其命名为replacingRange 或者replacingSubrange 这是返回Self所必需的。如果您想返回String,您可以将其删除。

以上是关于截断字符串的中间并替换它 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 4 中替换整个字符串或部分字符串 [重复]

python 正则表达式匹配并替换字符串的开头和结尾但保留中间

替换`overflow:hidden`,它不会剪辑中间字符

java 字符串替换 怎么替换[]中间内容

截断查询字符串并返回干净的 URL C# ASP.net

确定 UITextView 将截断字符串的位置