Swift 4字符串操作:实现删除指定字符间内容的函数
我来帮你完善这个字符串处理函数,根据你的需求,我提供两种不同的实现方案,分别对应不同的使用场景:
方案1:删除第一个起始字符到最后一个结束字符之间的所有内容
这个方案完全匹配你给出的示例需求——把从第一个(开始到最后一个)结束的所有内容(包括这两个字符本身)全部删除,只保留起始字符之前的部分(如果结束字符之后还有内容也会保留)。
func deleteInnerString(with string: String, from firstCharacter: String, to secondCharacter: String) -> String { // 处理空分隔符的边界情况 guard !firstCharacter.isEmpty, !secondCharacter.isEmpty else { return string } // 定位第一个起始字符的位置 guard let leftRange = string.range(of: firstCharacter) else { return string // 找不到起始字符,直接返回原字符串 } let leftStartIndex = leftRange.lowerBound // 从起始字符的位置开始,反向查找最后一个结束字符的位置(确保结束字符在起始字符之后) guard let rightRange = string.range(of: secondCharacter, options: .backwards, range: leftStartIndex..<string.endIndex) else { return string // 找不到有效的结束字符,返回原字符串 } let rightEndIndex = rightRange.upperBound // 拼接结果:起始字符之前的部分 + 结束字符之后的部分 let prefix = string[..<leftStartIndex] let suffix = string[rightEndIndex...] return String(prefix + suffix) }
测试你的示例
let originalString = "Boll %b (Teeth Alligator (13,8,8,5,5,3,n),20,2,ma)" let processedString = deleteInnerString(with: originalString, from: "(", to: ")") print(processedString) // 输出:"Boll %b "
(注:输出结果末尾的空格是原字符串中%b和(之间的空格,如果你需要去掉它,可以在函数末尾对结果做一次trimmingCharacters(in: .whitespaces)处理)
方案2:删除所有成对指定字符之间的内容(支持嵌套)
如果你的需求是删除所有出现的成对起始/结束字符之间的内容(比如处理"a(b)c(d)e"得到"ace",或者处理嵌套的"a(b(c)d)e"得到"ae"),可以用栈来跟踪嵌套层级,实现更通用的处理:
func deleteAllInnerStrings(with string: String, from firstChar: Character, to secondChar: Character) -> String { var result = "" var nestingStack = [Character]() for char in string { switch char { case firstChar: // 遇到起始字符,入栈标记嵌套层级 nestingStack.append(char) case secondChar: // 遇到结束字符,若栈不为空则出栈(表示退出一层嵌套),否则保留该字符 if !nestingStack.isEmpty { nestingStack.removeLast() } else { result.append(char) } default: // 只有当不在嵌套层级中时,才将字符加入结果 if nestingStack.isEmpty { result.append(char) } } } return result }
测试示例
// 你的原示例 let original = "Boll %b (Teeth Alligator (13,8,8,5,5,3,n),20,2,ma)" print(deleteAllInnerStrings(with: original, from: "(", to: ")")) // 输出:"Boll %b " // 多组括号的情况 let multiBracketStr = "Hello (world) foo (bar(baz)) test" print(deleteAllInnerStrings(with: multiBracketStr, from: "(", to: ")")) // 输出:"Hello foo test"
内容的提问来源于stack exchange,提问作者Konstantinos Natsios
相关产品推荐
相关产品推荐

