You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键改动说明

  1. 返回类型调整:将原方法的[String]改为[(String, ClosedRange<Int>)],每个元素是子串和对应的整数闭合范围
  2. 范围计算:使用utf16Offset(in:)方法快速获取字符的整数偏移量,保证性能且符合示例中的索引表示
  3. 遍历匹配结果:逐个处理正则匹配项,计算每个分割子串的范围并添加到结果数组
  4. 处理剩余子串:最后添加正则匹配结束后剩余的子串及其范围

内容的提问来源于stack exchange,提问作者KANAYO AUGUSTIN UG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:55:22