如何从单个字符串提取字母及连续整数(多连续整数视为整体)
解决方案
一、更优实现方法:正则表达式匹配
直接用正则匹配连续的字母或数字序列,一步到位,逻辑清晰且无边界问题,完全符合需求。
Swift代码示例:
let input = "ab2bc31d" // 正则模式:匹配连续大小写字母,或连续数字 let pattern = "[a-zA-Z]+|\\d+" if let regex = try? NSRegularExpression(pattern: pattern) { let matches = regex.matches(in: input, range: NSRange(input.startIndex..., in: input)) let result = matches.map { String(input[Range($0.range, in: input)!]) } print(result) // 输出 ["ab", "2", "bc", "31", "d"] }
不管输入是字母开头还是数字开头,都能自动按连续同类字符分组,无需额外处理。
二、修复原有components方法的问题
你的代码崩溃是因为intArr里的空字符串数量和stringArr的元素数量不匹配,导致stringArr.removeFirst()越界。修复思路是先提取两类字符的有效片段,再按原字符串顺序交替合并:
let input = "ab2bc31d" // 提取非空的数字片段 let numberSegments = input.components(separatedBy: CharacterSet.decimalDigits.inverted).filter { !$0.isEmpty } // 提取非空的字母片段 let letterSegments = input.components(separatedBy: CharacterSet.letters.inverted).filter { !$0.isEmpty } var result = [String]() var numIdx = 0 var letterIdx = 0 // 判断字符串起始类型,决定合并顺序 let startsWithLetter = input.first?.isLetter ?? false if startsWithLetter { // 字母开头,交替添加字母段、数字段 while letterIdx < letterSegments.count || numIdx < numberSegments.count { if letterIdx < letterSegments.count { result.append(letterSegments[letterIdx]) letterIdx += 1 } if numIdx < numberSegments.count { result.append(numberSegments[numIdx]) numIdx += 1 } } } else { // 数字开头,交替添加数字段、字母段 while numIdx < numberSegments.count || letterIdx < letterSegments.count { if numIdx < numberSegments.count { result.append(numberSegments[numIdx]) numIdx += 1 } if letterIdx < letterSegments.count { result.append(letterSegments[letterIdx]) letterIdx += 1 } } } print(result) // 输出 ["ab", "2", "bc", "31", "d"]
该方法先剥离空字符串干扰,再按原字符串的起始类型交替合并片段,彻底解决越界问题。
内容的提问来源于stack exchange,提问作者ogispert
相关产品推荐
相关产品推荐

