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
相关产品推荐
相关产品推荐

