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

Swift3中如何从字符串提取方括号内的多个子串?

在Swift 3中提取字符串中所有方括号内的子串

我来帮你搞定这个问题!你的目标是从"[Desired Annual Income] /([Income per loan %] /100)"里提取Desired Annual Income和Income per loan %这两个子串,原来的代码只能处理第一对括号,这里有两种靠谱的实现方法:

问题分析

你之前的代码只查找了第一个[和第一个],只能拿到第一个子串,没法处理多组括号的场景。我们需要能匹配所有方括号对的方案,下面两种方法都能完美解决这个需求。

方法一:使用正则表达式(推荐)

正则可以一次性匹配所有[xxx]格式的内容,精准提取括号内的子串,代码简洁高效:

let myString = "[Desired Annual Income] /([Income per loan %] /100)"

do {
    // 正则模式:匹配[开头、]结尾,中间是任意非]的字符,捕获组1对应括号内的内容
    let regex = try NSRegularExpression(pattern: "\\[([^\\]]+)\\]", options: [])
    let matches = regex.matches(
        in: myString,
        options: [],
        range: NSRange(location: 0, length: myString.utf16.count)
    )
    
    var extractedStrings: [String] = []
    for match in matches {
        // 将OC的NSRange转换为Swift原生Range
        if let swiftRange = Range(match.range(at: 1), in: myString) {
            let substring = String(myString[swiftRange])
            extractedStrings.append(substring)
        }
    }
    
    print(extractedStrings) // 输出 ["Desired Annual Income", "Income per loan %"]
} catch {
    print("正则表达式初始化失败:\(error.localizedDescription)")
}

代码说明

  • 正则模式\\[([^\\]]+)\\]:\\[和\\]是转义后的方括号,[^\\]]+表示匹配一个或多个不是]的字符,确保不会跨多个括号匹配内容。
  • matches(in:)会返回所有符合条件的匹配结果,每个match的range(at:1)对应我们定义的捕获组,也就是括号内的子串范围。
  • 最后把NSRange转换成Swift原生Range,就能提取出目标子串了。

方法二:手动遍历字符串(无需正则)

如果你不想用正则,也可以通过循环查找每个[和对应的]来提取子串,逻辑更直观:

let myString = "[Desired Annual Income] /([Income per loan %] /100)"
var remainingString = myString
var extractedStrings: [String] = []

while let startBracketIndex = remainingString.firstIndex(of: "[") {
    // 找到当前[之后的第一个]
    guard let endBracketIndex = remainingString.firstIndex(of: "]") else {
        break
    }
    
    // 提取括号内的内容:跳过首尾的方括号
    let substring = remainingString[startBracketIndex...endBracketIndex]
        .dropFirst() // 去掉开头的[
        .dropLast()  // 去掉结尾的]
    extractedStrings.append(String(substring))
    
    // 更新剩余字符串,从当前]的下一个字符开始继续查找
    if let nextStartIndex = remainingString.index(after: endBracketIndex) {
        remainingString = String(remainingString[nextStartIndex...])
    } else {
        break
    }
}

print(extractedStrings) // 输出 ["Desired Annual Income", "Income per loan %"]

代码说明

  • 循环查找剩余字符串中的第一个[,然后匹配对应的第一个],确保每一组括号都被单独处理。
  • 通过dropFirst()和dropLast()去掉方括号,得到我们需要的纯文本内容。
  • 更新剩余字符串为当前]之后的部分,继续循环直到找不到[或]为止。

内容的提问来源于stack exchange,提问作者Anand Gautam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:03:13