代码之家  ›  专栏  ›  技术社区  ›  Konstantinos Natsios

特定字符的Swift 4字符串范围

  •  0
  • Konstantinos Natsios  · 技术社区  · 8 年前

    我试图在字符串中创建一个函数,从提供的字符串中删除一些字符。

    例如,我有

    "‌Boll %b‌ (Teeth ‌Alligator‌ (13,8,8,5,5,3,n),20,2,ma)"
    

    我想将此编辑为

    "‌Boll %b‌"
    

    这意味着删除 "(" ")"

    所以我做了这个函数

    func deleteInnerString(with string: String, from firstCharacter: String, to secondCharacter: String) -> String {
        guard let leftIndex = (string.range(of: firstCharacter)?.lowerBound),
            let rightIndex = string.range(of: secondCharacter)?.lowerBound else {
                return string
        }
        let remainingString = String(string.prefix(upTo: leftIndex) + string.suffix(from: string.index(after: rightIndex)))
        return remainingString
    }
    

    但在这种情况下,输出字符串是

    "‌Boll %b‌ ,20,2,ma)"
    

    问题是,如何扫描字符串以找到最后一个右括号范围??

    3 回复  |  直到 8 年前
        1
  •  3
  •   Luca Angeletti    8 年前

    请注意,您的策略不适用于非嵌套括号。

    E、 g.此输入

    a(b)c(d)e
    

    使用您的方法将产生此输出

    ae
    

    这是不正确的。

    解决方案

    此解决方案将与 嵌套的 非嵌套 括号

    let text = "‌a(b)c(d)e"
    var numOfNestedParentesis = 0
    var indexesToRemove:Set<Int> = []
    
    for (index, char) in text.enumerated() {
    
        if char == "(" {
            numOfNestedParentesis += 1
        }
    
        if numOfNestedParentesis > 0 {
            indexesToRemove.insert(index)
        }
    
        if char == ")" {
            numOfNestedParentesis -= 1
        }
    }
    
    let result = String(text.enumerated()
        .filter { !indexesToRemove.contains($0.offset) }
        .map { $0.element } )
    

    测验

    print(result) // ‌ace
    
        2
  •  2
  •   Guy Kogus    8 年前

    这个 String.range 函数可以提供额外的选项,因此您可以通过 String.CompareOptions.backwards 获取最后一个实例的参数。

    func deleteInnerString(with string: String, from firstCharacter: String, to secondCharacter: String) -> String {
        guard let leftIndex = (string.range(of: firstCharacter)?.lowerBound),
            let rightIndex = string.range(of: secondCharacter, options: .backwards)?.lowerBound else {
                return string
        }
        let remainingString = String(string.prefix(upTo: leftIndex) + string.suffix(from: string.index(after: rightIndex)))
        return remainingString
    }
    
        3
  •  1
  •   Jaydeep Vora    8 年前

    你必须使用 .backwards 选项 String.CompareOptions 在里面 range 字符串的函数。如下所示

    func deleteString(with string: String, from firstCharacter: String, to secondCharacter: String) -> String {
        guard let leftIndex = (string.range(of: firstCharacter)?.lowerBound),
            let rightIndex = string.range(of: secondCharacter, options: .backwards)?.lowerBound else {
                return string
        }
        let remainingString = String(string.prefix(upTo: leftIndex) + string.suffix(from: string.index(after: rightIndex)))
    
        return remainingString.trimmingCharacters(in: .whitespaces)
    }