Swift 5分割句子为单词、标点、空格数组的代码问题排查
需求说明
- 目标:使用Swift 5通过编程方式将句子分割为独立元素,单词、包含空格在内的标点符号各自单独作为数组项
- 输入示例:
"Hello, I am Albert Einstein." - 期望输出:
["Hello", ",", " ", "I", " ", "am", " ", "Albert", " ", "Einstein", "."]
基于参考代码修改后出现异常:空格没有成为独立数组元素,反而被拼接在后续单词元素的开头。
代码逻辑错误定位
修改后的代码存在两处核心逻辑问题,还有一处笔误:
- 边界判断缺失:现有逻辑仅覆盖了「正在拼接普通单词时遇到分隔符(标点/空格)」的场景,没有处理「正在缓存分隔符时遇到普通单词字符」「正在缓存分隔符时遇到另一个不同分隔符」的场景。比如遍历完逗号后缓存内容为
,,后续遍历到空格、再遍历到字符I时,遇到I的分支逻辑直接将I拼接到缓存的空格后面,就会生成I这种带前置空格的错误元素。 - 分隔符未即时存入结果:所有分隔符(空格、逗号、句号等)都需要作为独立元素存在,不能和其他字符拼接,现有逻辑没有在字符类型切换(普通词<->分隔符、分隔符<->分隔符)时第一时间把缓存的分隔符存入结果数组。
- 笔误:函数参数名为
text_input,内部枚举字符时却调用了text.enumerateSubstrings,会直接触发编译错误。
修正后可运行代码
func sentenceSplitter(text_input: String) -> [String] { // 定义需要单独拆分的分隔符集合 let separators = CharacterSet(charactersIn: " ,.;!?") var list = [String]() var currentSubString = "" text_input.enumerateSubstrings(in: text_input.startIndex..<text_input.endIndex, options: .byComposedCharacterSequences) { (substring, _, _, _) in guard let char = substring else { return } let isSeparator = char.unicodeScalars.allSatisfy { separators.contains($0) } if isSeparator { // 当前字符是分隔符,先把之前缓存的内容(单词/其他分隔符)存入数组 if !currentSubString.isEmpty { list.append(currentSubString) } // 分隔符单字独立,直接作为新的缓存项 currentSubString = char } else { // 当前字符是普通单词字符 if !currentSubString.isEmpty { // 如果之前缓存的是分隔符,先存入数组再清空缓存 let lastIsSeparator = currentSubString.unicodeScalars.allSatisfy { separators.contains($0) } if lastIsSeparator { list.append(currentSubString) currentSubString = "" } } // 拼接普通单词字符 currentSubString += char } } // 存入最后一段缓存内容 if !currentSubString.isEmpty { list.append(currentSubString) } return list }
调用测试:
let testInput = "Hello, I am Albert Einstein." let result = sentenceSplitter(text_input: testInput) print(result) // 输出: ["Hello", ",", " ", "I", " ", "am", " ", "Albert", " ", "Einstein", "."]
内容的提问来源于stack exchange,提问作者user8460166
相关产品推荐
相关产品推荐

