Swift中如何修改正则分割方法返回带Range的元组数组?
修改Swift正则分割方法返回子串与范围元组
以下是修改后的String扩展方法,它会返回包含分割子串及其对应整数范围的元组数组,完全匹配你给出的示例需求:
extension String { func splitWithRegex(by regexStr: String) -> [(String, ClosedRange<Int>)] { guard let regex = try? NSRegularExpression(pattern: regexStr) else { return [] } let nsRange = NSRange(startIndex..., in: self) var currentIndex = startIndex var result: [(String, ClosedRange<Int>)] = [] for match in regex.matches(in: self, range: nsRange) { guard let matchRange = Range(match.range, in: self) else { continue } let substringRange = currentIndex..<matchRange.lowerBound let substring = String(self[substringRange]) let startOffset = currentIndex.utf16Offset(in: self) let endOffset = matchRange.lowerBound.utf16Offset(in: self) result.append( (substring, startOffset...endOffset) ) currentIndex = matchRange.upperBound } let remainingSubstring = String(self[currentIndex...]) let remainingStartOffset = currentIndex.utf16Offset(in: self) let remainingEndOffset = endIndex.utf16Offset(in: self) result.append( (remainingSubstring, remainingStartOffset...remainingEndOffset) ) return result } }
使用示例
let string = "This is a string" let stringRange = string.splitWithRegex(by: "\\s+") // 打印结果 for (substring, range) in stringRange { print("(\(substring), \(range))") }
输出结果
(This, 0...4) (is, 5...7) (a, 8...9) (string, 10...16)
关键改动说明
- 返回类型调整:将原方法的
[String]改为[(String, ClosedRange<Int>)],每个元素是子串和对应的整数闭合范围 - 范围计算:使用
utf16Offset(in:)方法快速获取字符的整数偏移量,保证性能且符合示例中的索引表示 - 遍历匹配结果:逐个处理正则匹配项,计算每个分割子串的范围并添加到结果数组
- 处理剩余子串:最后添加正则匹配结束后剩余的子串及其范围
内容的提问来源于stack exchange,提问作者KANAYO AUGUSTIN UG
相关产品推荐
相关产品推荐

